二叉树对称判断
Posted dazhu123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树对称判断相关的知识,希望对你有一定的参考价值。
1:题目描述
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2:题目分析
题目判断二叉树是不是对称二叉树?关键在于:判断对称二叉树要进行左右子节点的同时判断,流程大概如下图;
对root节点的左右子节点进行判断,如果相等则开启递归判断;递归逻辑为:判断两个A和B节点 先判断A.left.value == B.right.value然后A.left.right == B.left.value是不是相等。如果都相等则返回true。整体来看这种判断方式依然是前序遍历的一种变形,先操作本节点,然后根据当前情况再去操作子节点。
针对本题目我们设计的方法是:首先判断的两个子节点想不想等,如果相等则进行迭代判断。迭代三要素为:
- 迭代终止条件:当前节点.value不相等,或者有一个节点为null,或者两个节点都为null
- 终止情况处理:当前节点.value不相等,或者有一个节点为null则return false,意味着不可能对称,当两个节点都为null,则本题中,如果两个节点都为null,则意味着两侧的节点都进去null,则应该return true,开始其他位置的迭代判断。
- 迭代逻辑:如果当前A和B节点值相等,则先迭代判断A.left.value和B.right.value是不是相等,然后再前面为真的基础之上再迭代判断A.rigth.value和B.left.value是不是相等。可以采用 return isEquals(A.left.value,B.right.value)&&isEquals(A.right.value,B.left.value)的方式,&&的关系,一旦前面不成立,则后面也不成立。
说到这里我们来回归前面做过的题目;对二叉树的镜像输出;请完成一个函数,输入一个二叉树,该函数输出它的镜像。
例如输入:
4
/
2 7
/ /
1 3 6 9
镜像输出:
4
/
7 2
/ /
9 6 3 1
我们当时采用的对每一个节点左右子节点进行交换的方式来处理!通过前序遍历的顺序对当前节点进行左右子树的交换!!!
上面两种对二叉树迭代操作又有区别又有联系!应该都要好好理解,两次比较操作的应该采用第一种方式。单侧操作的采用第二种方式
3:代码示例
class Solution { public boolean isSymmetric(TreeNode root) { if(root == null){ return true; } if(root!=null&&root.right==null&&root.left==null){ return true; } if(root!=null&&root.left!=null&&root.right!=null) { return isEqual(root.left, root.right); } else{ return false; } } //通过递归来判断两个树是不是相等的 //递归三要素 //1:递归终止条件:两个节点值不等,则不可能对称。两个节点有一个为null,则不可能对称。 //2:递归终止情况处理:直接return false,代表不可能对称 //3:递归逻辑:如果当前节点值相等则继续递归判断。 public boolean isEqual(TreeNode A,TreeNode B) { if(A == null&&B == null){ return true; } if(A == null||B == null){ return false; } if(A.val != B.val){ return false; }else { //这种方式意味着,当前仅当,isEqual(A.left,B.right)为真的情况下, //才会有必要继续判断isEqual(A.right,B.left)。 return isEqual(A.left,B.right)&&isEqual(A.right,B.left); } } }
以上是关于二叉树对称判断的主要内容,如果未能解决你的问题,请参考以下文章