二叉树对称判断

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。整体来看这种判断方式依然是前序遍历的一种变形,先操作本节点,然后根据当前情况再去操作子节点。

  针对本题目我们设计的方法是:首先判断的两个子节点想不想等,如果相等则进行迭代判断。迭代三要素为:

  1. 迭代终止条件:当前节点.value不相等,或者有一个节点为null,或者两个节点都为null
  2. 终止情况处理:当前节点.value不相等,或者有一个节点为null则return false,意味着不可能对称,当两个节点都为null,则本题中,如果两个节点都为null,则意味着两侧的节点都进去null,则应该return true,开始其他位置的迭代判断。
  3. 迭代逻辑:如果当前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);
         }
     }


}

 

以上是关于二叉树对称判断的主要内容,如果未能解决你的问题,请参考以下文章

60.对称的二叉树

第76题给定一棵二叉树,判断它是否是对称的

二叉树对称判断

判断对称二叉树

给定一个二叉树,如何判断它是对称的

给定一个二叉树,如何判断它是对称的