目录
1.递归
用递归来解决是一个很好的方法,首先如何判断一棵树是否是对称的呢,对于一个根来说,如果他的左右子树相互对称,或者都没有,那么他就是对称的。
代码上实现我们把一棵树当成两颗,一个往左走去和另一个往右走的比较,相反也是一样。
对比两个节点有下面几种情况:
1.都为空,说明对称
2.其中一个为空或者值不相等,不对称
3.一个节点往左走和另一个往右走看是否对称,相反也是一样
代码如下所示:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool Symmetrical(TreeNode* r1, TreeNode* r2){
if(r1==NULL&&r2==NULL){
return true;
}
if(r1==NULL||r2==NULL||r1->val!=r2->val){
return false;
}
return Symmetrical(r1->left, r2->right) && Symmetrical(r1->right, r2->left);
}
bool isSymmetrical(TreeNode* pRoot) {
return Symmetrical(pRoot, pRoot);
}
};
2.队列
这里用一个队列模拟之前的递归操作。
我们可以这么想,如果是对称的,那么树的每一层都是对称的回文结构,那么我们在二叉树里面按照层序遍历的思路来按照相反的方向去遍历,如果出来的值是相等或都为空,那么就是对称的,如果存在值不相等,或一个是空节点,那么就不对称。
代码如下所示:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot) {
if(pRoot==NULL){
return true;
}
queue<TreeNode*>q1;
queue<TreeNode*>q2;
q1.push(pRoot);
q2.push(pRoot);
while(!q1.empty() && !q2.empty()){
TreeNode *left=q1.front();
q1.pop();
TreeNode *right=q2.front();
q2.pop();
if(left==NULL && right==NULL){
continue;
}
if(left==NULL || right==NULL || left->val!=right->val){
return false;
}
q1.push(left->left);
q1.push(left->right);
q2.push(right->right);
q2.push(right->left);
}
return true;
}
};