首页 > 其他分享 >4.对称二叉树

4.对称二叉树

时间:2023-12-07 21:22:24浏览次数:29  
标签:right return TreeNode 二叉树 对称 null 节点 left

101. 对称二叉树

1、概要

给你一个二叉树的根节点 root , 检查它是否轴对称。

判断对称二叉树要比较的不是左右节点!是根节点的左子树与右子树是不是相互翻转。

其实要比较的是两个树,即根节点的左右子树。两个子树的里侧外侧是否相等。

只能是“后序遍历”,要通过递归函数的返回值来判断。准确来说是一个树左右中,一个树右左中。

2、思路

递归法

  • 递归函数参数与返回值

参数是左右子树,返回bool

public boolean compare(TreeNode left,TreeNode right)
  • 终止条件

要比较两个节点数值相不相同,要把两个节点为空的情况弄清楚,避免空指针

  1. 左节点为空,右节点不为空,false
  2. 左不为空,右为空,false
  3. 左右都为空,true
  4. 左右都不空,比较节点数值,不相同false
		//左空 右不空
        if(left == null && right != null){
            return false;
        }
        //左不空 右空
        if(left!= null && right == null){
            return false;
        }
        //左空 右空
        if(left==null && right == null){
            return true;
        }
        //左不空 右不空 但不等
        if(left.val != right.val){
            return false;
        }
  • 单层逻辑

单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。

  1. 比较外侧:左节点左孩子,右节点右孩子
  2. 比较内侧:左节点右孩子,右节点左孩子
  3. 都对称返回true,有一侧不对称返回false
		//左不空 右不空 且相等
        //比较外侧,左节点-左孩子 右节点-右孩子
        boolean outside = compare(left.left,right.right);
        //比较内侧,左节点-右孩子 右节点-左孩子
        boolean inside = compare(left.right,right.left);

        return outside && inside;

迭代法

本题的本质是判断两个树是否是相互翻转的,其实已经不是所谓二叉树遍历的前中后序的关系了

可以使用队列来比较两个树(根节点的左右子树)是否相互翻转,(注意这不是层序遍历

2

其实是把左右两个子树要比较的元素顺序放进一个容器,然后成对成对的取出来进行比较,那么其实使用栈也是可以的。

3、代码

class Solution {
    public boolean isSymmetric(TreeNode root) {
        //return compare(root.left,root.right);
        return compareN(root);
    }
    //迭代 队列 栈一致
    public boolean compareN(TreeNode node){
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(node.left);
        que.offer(node.right);
        while(!que.isEmpty()){
            TreeNode left = que.poll();
            TreeNode right = que.poll();
            if(left == null && right == null){
                continue;
            }
            if(left == null || right == null || left.val != right.val){
                return false;
            }

            que.offer(left.left);
            que.offer(right.right);
            que.offer(left.right);
            que.offer(right.left);
        }
        return true;
    }

    //递归
    public boolean compare(TreeNode left,TreeNode right){
        //左空 右不空
        if(left == null && right != null){
            return false;
        }
        //左不空 右空
        if(left!= null && right == null){
            return false;
        }
        //左空 右空
        if(left==null && right == null){
            return true;
        }
        //左不空 右不空 但不等
        if(left.val != right.val){
            return false;
        }
        //左不空 右不空 且相等
        //比较外侧,左节点-左孩子 右节点-右孩子
        boolean outside = compare(left.left,right.right);
        //比较内侧,左节点-右孩子 右节点-左孩子
        boolean inside = compare(left.right,right.left);

        return outside && inside;
    }
}

相关题目

100. 相同的树

情况均相同,对比同侧即可

compare(left.left,right.left)

compare(left.right,right.right)

572. 另一棵树的子树

终止条件不同

可以是完全相同,可以是左子树,可以是右子树

class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        return compare(root,subRoot);
    }

    public boolean compare(TreeNode s,TreeNode t){
        
        if(s == null) return false;
        

        return compare(s.left,t) || compare(s.right,t) || same(s,t);
    }

    public boolean same(TreeNode left,TreeNode right){
        if(left == null && right  == null){
            return true;
        }
        if(left == null || right == null || left.val != right.val){
            return false;
        }

        return same(left.left,right.left) && same(left.right,right.right);
    }
}

标签:right,return,TreeNode,二叉树,对称,null,节点,left
From: https://www.cnblogs.com/autumnmoonming/p/17883999.html

相关文章

  • 3.翻转二叉树
    226.翻转二叉树1、概要给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。想要翻转它,其实就把每一个节点的左右孩子交换一下就可以关键在于遍历顺序选择哪一种,遍历的过程中去翻转每一个节点的左右孩子就可以达到翻转效果。中序不方便,会把某些节点的左右孩子翻转......
  • 【OpenSSL】哈希、非对称加密和对称加密函数使用
    1.哈希1.1md5的使用头文件#include<openssl/md5.h>#include<openssl/sha.h>MD5散列值的长度#defineMD5_DIGEST_LENGTH16//根据这个分配一块空内存保存散列值初始化MD5->给MD5传入运算的数据(可以多次传入)->计算MD5#defineMD5_DIGEST_LENGTH1......
  • 全局平衡二叉树学习笔记 && [SDOI2017]切树游戏解题报告
    首先,任何一个卡树剖的出题人都很没有素质前言2023年8月22日,XDFnoip模拟赛场上,神犇liuhangxin自己发明了矩阵乘法维护FWT,可是出成绩的时候发现本题挂了30分。2023年9月22日,菜鸡cool_milo看到了liuhangxin的题解,但是由于太菜,并没有看懂。2023年10月22日,菜......
  • 2.二叉树层序遍历
    107.二叉树的层序遍历II相对于102.二叉树的层序遍历,就是最后把result数组反转一下就可以了。classSolution{//利用链表可以进行o(1)头部插入publicLinkedList<List<Integer>>res=newLinkedList<List<Integer>>();publicList<List<Integer>>levelOrd......
  • 1.二叉树
    二叉树的种类满二叉树满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。完全二叉树完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边......
  • 第5章. 二叉树
    二叉树一、树的基本概念节点、根节点、父节点、子节点、兄弟节点一棵树可以没有任何节点,称为空树一棵树可以只有一个节点,也就是只有根节点子树、左子树、右子树节点的度:子树的个数树的度:所有节点度中的最大值叶子节点:度为0的节点非叶子节点:度不为0的节点层数:根节点......
  • 17_二叉树的所有路径
    二叉树的所有路径给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。示例1:输入:root=[1,2,3,null,5]输出:["1->2->5","1->3"]示例2:输入:root=[1]输出:["1"]【思路】题目要求从根节点到叶子的路径,所以需要......
  • 16_平衡二叉树
    平衡二叉树【题外话】二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。(从上往下看)二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。(从下往上看)小疑惑:为什么104.二叉树的最大深度中求的是二叉树的最大深度,也用的是后序遍历。(本质上求解的就是根节......
  • 15_完全二叉树的节点个数
    完全二叉树的节点个数给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~2h个节点。示......
  • 二叉树创建及遍历
    #include<stdio.h>#include<iostream>usingnamespacestd;typedefcharTElemType;typedefvoidStatus;typedefintElemType;typedefstructBiTNode{ TElemTypedata; BiTNode*lchild,*rchild;}BiTNode,*BiTree;voidCreateBiTree(BiTree......