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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值