101. Symmetric Tree的C++解法

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
    }
};

猜你喜欢

转载自blog.csdn.net/musechipin/article/details/85005947