版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/musechipin/article/details/85005947
一开始陷入了一个误区,认为【对称树】和【中序遍历结果对称】是充要条件,但其实中序遍历结果对称的不一定是对称树,如[1,2,3,3,#,2,#]。所以代码在lintcode上通过了但是没在leetcode上通过。(leetcode上的测试数据设计得更好一些
其实树的问题基本都可以使用递归问题,在这里不是要判断左子树和右子树是否一样,而是判断左子树的左子树和右子树的右子树,以及左子树的右子树和右子树的左子树是否一样。注意别忘了判断左子树和右子树的值是否相等。
class Solution {
public:
bool isSymmetric(TreeNode * root) {
if (root==NULL) return 1;
return cmpTree(root->left,root->right);
}
bool cmpTree(TreeNode * l,TreeNode * r){
if (l==NULL)
{if (r==NULL) return true;
else return false;}
else {if (r==NULL) return false;
else return (l->val==r->val)&&cmpTree(l->left,r->right)&&cmpTree(l->right,r->left);;}
}
};
还有一个使用栈的非递归方式很巧妙。一次push或pop两组数,比较两组数是否相等即可。
class Solution {
public:
bool isSymmetric (TreeNode* root) {
if (!root) return true;
stack<TreeNode*> s;
s.push(root->left);
s.push(root->right);
while (!s.empty ()) {
auto p = s.top (); s.pop();
auto q = s.top (); s.pop();
if (!p && !q) continue;
if (!p || !q) return false;
if (p->val != q->val) return false;
s.push(p->left);
s.push(q->right);
s.push(p->right);
s.push(q->left);
}
return true;
}
};