一、题意
二、思考过程
**思路:**判断二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互反转的,理解这一点之后其实知道了要比较的是两棵树,所以在递归遍历的过程中要同时遍历这两棵树,然后比较这两棵树,比较的是 两棵树的里侧和外侧元素是否相等。
2.1递归法
递归法三部曲:
- 确定递归函数的参数和返回值
bool compare(TreeNode *left,TreeNode *right)
- 确定终止条件
//首先排除空节点的情况 if(left==NULL&&right!=NULL) return false; else if(left!=NULL&&right==NULL) return false; else if(left==NULL&&right==NULL) return true; //排除了空节点,在排除数值不相同的情况 else if(left->val!=right->val) return false;
- 确定单层递归的逻辑
单层递归逻辑就是:处理左右节点都不为空且数值相等的情况
/* 此时就是左右节点都不为空的时候且数值相等的情况 此时才做递归,做下一层的判断 */ //比较外侧: //左子树:左;右子树:右 bool outside=compare(left->left,right->right); //比较内侧 //左子树:右;右子树:左 bool inside=compare(left->right,right->left); //逻辑处理 bool isSame=outside&&inside; return isSame;
递归法完整代码:
class Solution { public: bool compare(TreeNode* left,TreeNode* right) { //首先排除空节点的情况 if(left==NULL&&right!=NULL) return false; else if(left!=NULL&&right==NULL) return false; else if(left==NULL&&right==NULL) return true; //排除了空节点,在排除数值不相同的情况 else if(left->val!=right->val) return false; /* 此时就是左右节点都不为空的时候且数值相等的情况 此时才做递归,做下一层的判断 */ //外侧: //左子树:左;右子树:右 bool outside=compare(left->left,right->right); //内侧 //左子树:右;右子树:左 bool inside=compare(left->right,right->left); //逻辑处理 bool isSame=outside&&inside; return isSame; } bool isSymmetric(TreeNode* root) { if(root==NULL) return true; return compare(root->left,root->right); } };