leetcode 101. 对称二叉树

题目描述:

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。


思路:递归调用一个判断两个树是否镜像对称的函数,首先判断根节点是否存在,若存在则比较他们的值是否相等,若相等,则继续比较树1的左子树和树2的右子树是否互为镜像,同时也比较树1的右子树和树2的左子树是否互为镜像。如果满足上面一系列条件,则说明以当前两个根节点为根节点的两颗树互为镜像。


代码:

方法一:递归

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root==NULL)return 1;
        return judge(root->left,root->right);
    }
    int judge(TreeNode * root1,TreeNode *root2){
        if(!root1&&!root2)return 1;
        else if(root1&&root2&&root1->val==root2->val&&judge(root1->left,root2->right)&&judge(root1->right,root2->left))return 1;
        else return 0;
    }
};

方法二:层次遍历

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root==NULL)return 1;
        queue<TreeNode *>q;
        q.push(root);
        while(!q.empty()){
            queue<TreeNode *>qt;
            vector<int>ans;
            while(!q.empty()){
                TreeNode * temp=q.front();
                q.pop();
                if(temp->left){
                    qt.push(temp->left);
                    ans.push_back(temp->left->val);
                }else{
                    ans.push_back(0);
                }
                if(temp->right){
                    qt.push(temp->right);
                    ans.push_back(temp->right->val);
                }else{
                    ans.push_back(0);
                }
            }
            q=qt;
            if(judge(ans)==0)return 0;
        }
        return 1;
    }
    int judge(vector<int>ans){
        int n=ans.size()-1;
        for(int i=0;i<=n;i++,n--){
            if(ans[i]!=ans[n])
                return 0;
        }
        return 1;
    }
};
代码有点复杂,开始没考虑到空结点的情况,最后靠补0来代替,最后调试了很久才调试出来。

猜你喜欢

转载自blog.csdn.net/weixin_42130471/article/details/80343820