算法题解记录28+++对称二叉树(百日筑基)

一、题目描述:

题目难度:简单
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
示例1
输入:root = [1,2,2,3,4,4,3]
输出:true


分割线


示例 2:
在这里插入图片描述
输入:root = [1,2,2,null,3,null,3]
输出:false


分割线


提示:
树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100


二、解题准备:

1.题意:解释题意

A.题目要求:判断一棵树是否轴对称。

一棵树的轴对称,主要看它的左子树在翻转后,左右子树是否相等
这涉及到翻转二叉树和判断二叉树相等的知识。

2.基本操作:题目涉及的基本操作

本题只涉及二叉树的遍历。

3.基础原理:题目涉及的算法的基本原理

A.DFS深度遍历

深度遍历是常用的二叉树算法。

B.BFS广度遍历

广度遍历同样是常用的二叉树算法,二者的结合,基本可以解决大部分二叉树问题。


分割线


三、解题思路:

思路:先翻转左子树,然后与右子树比较

A.翻转左子树

左子树的翻转方法,可以采用DFS,每一步翻转对应的左右节点,直到遇到null结点,说明翻转完毕。
代码为

private void reverse(TreeNode root){
	// 节点为null,说明翻转结束
    if(root==null){
        return;
    }

	// 翻转左右子节点
    TreeNode temp = root.right;
    root.right = root.left;
    root.left = temp;

	// 翻转左右子树
    reverse(root.left);
    reverse(root.right);
}

B.树相等的判断

回忆前序遍历算法,我们知道:
我们优先访问根节点,然后是左子树,最后是右子树。
如果我们同时访问两棵树,一样可以采用前序遍历算法,这时,只要顺序一样,就能够保证访问的层序、节点间的关系是一致的。
层序:比如根节点在第0层,第一个左子节点在第1层,左孙节点在第2层。
节点间关系:左子节点,在右子节点的左边。
代码为:

private boolean btEqual(TreeNode tree1, TreeNode tree2){
	// 都为空,说明相等【起码在这一分支上】
    if(tree1==null && tree2==null){
        return true;
    }
    // 只有一方为null,不相等
    if(tree1==null || tree2==null){
        return false;
    }
	// 如果值不同,不相等
    if(tree1.val != tree2.val){
        return false;
    }

	// 否则,返回下一层节点的判断结果
    return btEqual(tree1.left, tree2.left) && btEqual(tree1.right, tree2.right);
}

分割线


四、解题难点分析:

无。


分割线


五、代码:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        TreeNode left = root.left;
        TreeNode right = root.right;
        // 翻转左子树
        reverse(left);

        return btEqual(left, right);
    }

	// 判断两棵树相等否
    private boolean btEqual(TreeNode tree1, TreeNode tree2){
        if(tree1==null && tree2==null){
            return true;
        }
        if(tree1==null || tree2==null){
            return false;
        }

        if(tree1.val != tree2.val){
            return false;
        }

        return btEqual(tree1.left, tree2.left) && btEqual(tree1.right, tree2.right);
    }

	// 翻转树的函数
    private void reverse(TreeNode root){
        if(root==null){
            return;
        }

        TreeNode temp = root.right;
        root.right = root.left;
        root.left = temp;

        reverse(root.left);
        reverse(root.right);
    }
}

分割线


六、结语:

以上内容即我想分享的关于力扣热题28的一些知识。
我是蚊子码农,如有补充,欢迎在评论区留言。个人也是初学者,知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值