【剑指offer】【C++】【二叉树】28. 对称的二叉树

这篇博客介绍了如何解决力扣上的【对称的二叉树】问题。主要思路是通过递归判断二叉树的左右子节点是否对称。在递归过程中,当左右子节点同时为空表示到达叶子节点,若不同时为空,则需进一步比较它们的值。代码分析中详细解释了递归条件和终止条件,以及如何处理不同情况,如某个子节点为空或数值不相等的情况。
摘要由CSDN通过智能技术生成
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1主要思路:

  没有做出来。
在这里插入图片描述

  • 观察题目,应该如何判断其是对称的呢?

首先根节点的左右孩子应该都存在或者都不存在,存在时并相等;
此后左孩子的左孩子与右孩子的右孩子应该相等,并且左孩子的右孩子与右孩子的左孩子应该相等。

  • 判断的停止条件是什么?

二叉树的所有情况,根节点root为空或者只有根节点、双亲只有一个孩子、双亲有两个孩子;
每次都应该判断根节点不能为空,对于双亲只有一个孩子的在递归中可以通过每次判别根节点不为空来判别,对于双亲有两个孩子的可以通过左右孩子不为空来使其不再去判别叶子节点。

力扣中的详细解答

2 主要代码:

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root){
            return true;
        }else{
            return isSymmetric(root->left, root->right);
        }
    }

    bool isSymmetric(TreeNode* left, TreeNode* right){
        if(!left && ! right) return true;//不断递归判断,如果左右均为空,说明对称地访问 访问完了
        if(!left || !right || left->val!=right->val)return false;//如果某个为空或者都不为空但是值不相等,此时说明不相等
        return isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left);
        //接下来访问左子树的左孩子与右子树的右孩子、左子树的右孩子与右子树的左孩子。
    }

};

在这里插入图片描述

代码分析:

1)在递归的代码块中,如果left与right同时为空,那么说明到达了叶子节点,下边就没有孩子了。如果不同时为空,那么分为某个为空或者均不为空的情况,如果某个为空,那么就直接不相等,如果两个均不为空,但是数值不相等,那么也算不相等,直接返回false;

2)在最后一句递归的代码中,我们根据最小的树来看就可以。由第一幅图可以看出,应该实现的代码。另外,存在第四层,那么仍然是将两个3节点对应的指针送入函数进行判别。

3)我们可以发现,在遍历过程中,只要出现一次返回的是false,由于递归中的&&短路规则,导致后序的节点都不再进入函数中判断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值