剑指 Offer 28. 对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [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:
输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
0 <= 节点个数 <= 1000

这个题刚开始思路是在想对称的二叉树应该是有什么规律的,后面发现对称的二叉树的中序遍历结果是关于根节点对称的,但是在后面写出代码之后提交,很多样例过不了。想了才知道这种情况是只针对于满二叉树的情况,如果有叶子节点为空的话,这样的思路就过不了了,后面想了很久也没想到解决的办法
就去看题解看看有没有用这种方法解决的,发现都没有,,都是用递归,其实当时也是想过递归但是没想到怎么去递归,递归的方式一定要选好
最后写的思路是递归判断当前传进来的两个节点,如果都为空返回true,值不相等返回false,一个节点为空一个节点不为空返回false,再递归比较该第一个节点的左节点和该第二个节点的右节点以及该第一个节点的右节点和该第二个节点的左节点,这样递归下去就可以得到最终结果了
注意的是首先得特判根节点是不是为空,是的话直接返回true
再就是递归的方式,判断当前的两个节点就行
贴出代码:

class TreeNode {
    public $val = null;
    public $left = null;
    public $right = null;
    function __construct($value) { $this->val = $value; }
}
 
class Solution {
    /**
     * @param TreeNode $root
     * @return Boolean
     */
    function isSymmetric($root) {
        if ($root == null) {
            return true;
        }
        return $this->mid($root->left, $root->right);
    }

    //针对传进来的两个节点进行比较
    function mid($left, $right)
    {
        //两个节点同时为空返回true
        if ($left == null && $right == null) {
            return true;
        }
        //两个值不相等返回false
        if ($left->val != $right->val) {
            return false;
        }
        //当一个节点为空一个节点不为空返回false,因为上面判了同时为空
        if ($left == null || $right == null) {
            return false;
        }
        //递归判断两个节点
        return $this->mid($left->left, $right->right) && $this->mid($left->right, $right->left);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值