剑指 Offer 28. 对称的二叉树无取巧,易于理解!
Posted 来老铁干了这碗代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 28. 对称的二叉树无取巧,易于理解!相关的知识,希望对你有一定的参考价值。
看题解时,很多大牛用很少的代码就完成了AC,但可能看了很多遍也看不懂,因此萌生了写一种最“笨”最完整的代码的想法,这样大家可以通过我的代码入门,看懂了再去挑战大牛们的简洁解法。
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
限制:
0 <= 节点个数 <= 1000
题意:判断某树是否是对称的
最初思路:求出其“左根右”顺序的序列,求出其“右根左”顺序的序列,查看二者序列是否相等即可。
特例:若某个树的所有节点值都是相同的,则上述思路不成立。 因为即使树不对称,节点序列也始终相同。
改进1:将null值加入到序列中,这样就不会因为节点相同而误判。
改进2:直接在递归过程中完成判断,避免开辟多余的存储空间存储数组
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true;
// 同步对比左子树和右子树,因此新建一个方法进行递归
return isSymmetric(root.left, root.right);
}
public boolean isSymmetric(TreeNode r1, TreeNode r2) {
// 1、判断结构是否相同(空指针)
if(r1 == null && r2 == null) return true;
if(r1 == null || r2 == null) return false;
// 2、判断值是否相同
if(r1.val != r2.val) return false;
// 3、若既同构,而且值也相等,则应递归
boolean flag = false;
flag = isSymmetric(r1.left, r2.left) && isSymmetric(r1.right, r2.right);
return flag;
}
}
木秀于林,风必摧之;堆出于岸,流必湍之;行高于人,众必非之。
以上是关于剑指 Offer 28. 对称的二叉树无取巧,易于理解!的主要内容,如果未能解决你的问题,请参考以下文章