leetcode 101对称二叉树

二叉树?对称!

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

例子:
二叉树 [1,2,2,3,4,4,3] 是对称的
— 1
– /—\
–2----2
-/-\ – /-\
3 4-- 4 3

题目分析

  • 对称二叉树
    1.左右子树 ==> 结构相同
    2.左右子树 ==> 对应位置数字相同
二叉树对称 ==> 左右子树相同

对于当前根结点

左子树的右子树 右子树的左子树 相同
左子树的左子树 右子树的右子树 相同


递归 !!
判断每个结点的左右子树是否相同即可

解题思路

函数 作用
judge(TreeNodea,TreeNodeb) 判断两颗二叉树是否相同

过程:

  • 两棵树的根结点数值不同
    ==> return false

  • 两棵树的根结点都无左右子树(说明递归遍历到叶子节点)
    ==>return true

  • 两棵树的根结点的左右子树均存在
    ==>
    左子树的右子树–右子树的左子树相同
    左子树的左子树–右子树的右子树相同

    ==>return true

  • 两棵树的根结点的 左右子树结构不对应
    ==>
    有一棵树的左子树存在而另一颗树的右子树不存在
    有一棵树的右子树存在而另一棵树的左子树不存在

    ==>return false

  • 两棵树的根结点的左右子树不都存在但结构对应
    ==>
    有一棵树的左子树存在另一棵树的右子树对应存在
    有一棵树的右子树存在另一棵树的左子树对应存在

    ==>递归判断对应子树是否相同

代码如下

bool judge(TreeNode*a,TreeNode*b)
{
    if(a->val != b->val) return false;
    if(!a->right && !b->left && !a->left && !b->right) return true;     //递归遍历到叶子结点
    if(a->right && b->left&&a->left && b->right)
    {
        return (judge(a->right, b->left)&&judge(a->left, b->right));
    }
    if((a->right==NULL&& b->left)||(a->right&& b->left ==NULL) ||(a->left==NULL&& b->right)
    ||(a->left&& b->right ==NULL) ) return false;                      //a b树子树结构不对应
    if (a->right && b->left ) return judge(a->right, b->left);    //a树的右子树且b树的左子树存在
    if (a->left && b->right) return judge(a->left, b->right);     //a树的左子树且b树的右子树存在
    return false;
}
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root) return true;
        if(!root -> left && !root -> right) return true; 
        if(root -> left && root -> right) 
        return judge(root->left, root->right);
        else return false;
    }
};
发布了34 篇原创文章 · 获赞 0 · 访问量 581

猜你喜欢

转载自blog.csdn.net/Luyoom/article/details/104139578