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

LeetCode101.对称二叉树

时间:2023-11-05 14:48:39浏览次数:44  
标签:util right queue LeetCode101 二叉树 import 对称 null left

题目描述

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

示例

image
image

提条的代码

import java.util.List;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Collections;
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null)return true;
        List<List<Integer>> leftTree=levelOrder(root.left);
        List<List<Integer>> rightTree=levelOrder(root.right);
        if(leftTree.size()!=rightTree.size())return false;
        for(int i=0;i<leftTree.size();i++){
            List<Integer> leftCurrentLevel=leftTree.get(i);
            List<Integer> rightCurrentLevel=rightTree.get(i);
            Collections.reverse(leftCurrentLevel);
            if(!leftCurrentLevel.equals(rightCurrentLevel))return false;
        }
        return true;
    }

    public List<List<Integer>> levelOrder(TreeNode root){
        TreeNode cur=root;
        Deque<TreeNode> queue=new LinkedList<>();
        List<List<Integer>> result= new ArrayList<>();
        //剪枝处理
        if(root==null)return result;
        TreeNode temp=null;
        //初始化队列
        queue.offer(cur);
        while(!queue.isEmpty()){
            //当前层的树节点数量
            int count=queue.size();
            List<Integer> list=new ArrayList<>();
            //count到0意味着当前层遍历结束
            while(count>0){
                count--;
                temp=queue.poll();
                if(temp==null){
                    list.add(Integer.MIN_VALUE);
                    continue;
                }
                list.add(temp.val);
                queue.offer(temp.left);
                queue.offer(temp.right);
            }
            result.add(list);
        }
        return result;
    }
}

我的想法很简单,分给从根的左子树和右子树层序遍历,遍历出来的两颗树的当前层的内容依次进行取反比较(左子树或右子树其中一个进行取反比较就行),如果这个过程全部都通过那就返回true,否则返回false。

学习到的内容

由于我的方法跑出来的结果不太好,所以找了大佬们的方法来看,发现递归方法是最优方法,迭代法倒不是那么高效。
递归法:
image
咳,懒得电脑画图,就用笔画了。
从下面的代码开始说起,递归到最后一个节点(也是第一个执行递归主代码的节点)一定是图中标出的①的值为5的节点,左侧5的左节点和右侧5的右节点都是空,返回true,继而判断左侧5的右节点和右侧5的左节点,也都是true,所以左右5节点返回true;然后递归至上一层就会判断②对应的两个6是否对称,也返回true,所以左右两个3的左右子树是对称的,然后递归至上一层的两个4,判断③和④过程。一直递归值根节点1。

import java.util.List;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Collections;
class Solution {
    public boolean isSymmetric(TreeNode root) {
        return recursiveMethod(root.left,root.right);
    }

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

迭代法:
队列实现的迭代法是一层层地去判断是否对称的,我这里的顺序是左侧的左节点和右侧的右节点进行对称判断然后再判断左侧的右节点和右侧的左节点。过程就不赘述了,看下代码就知道,而且迭代法的执行效率不高其实。

import java.util.List;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Collections;
class Solution {
    public boolean isSymmetric(TreeNode root) {
        Deque<TreeNode> queue = new LinkedList<>();
        TreeNode left = root.left;
        TreeNode right = root.right;
        queue.offer(left);
        queue.offer(right);
        while(!queue.isEmpty()){
            left=queue.poll();
            right=queue.poll();
            if(left==null&&right==null)continue;

            //左右一个节点不为空,或者都不为空但数值不同,返回false
            if((left==null&&right!=null)||(left!=null&&right==null)||left.val!=right.val)return false;
            queue.offer(left.left);
            queue.offer(right.right);
            queue.offer(left.right);
            queue.offer(right.left);
        }

        return true;
    }
}

标签:util,right,queue,LeetCode101,二叉树,import,对称,null,left
From: https://www.cnblogs.com/whitePuPigeon/p/17810491.html

相关文章

  • 数据结构之树(二叉树的存储方式之链表)
    JavaJava中可以使用链表来实现二叉树的存储。1.链表实现二叉树的原理:   链表是由节点组成的数据结构,每个节点包含一个数据和指向下一个节点的指针。  在链表中,可以将二叉树的每个节点都看作一个链表节点,同时维护一个指向左子节点的指针和一个指向右子节点的指针。通过......
  • 101. 对称二叉树
    目录题目题解、前序遍历+递归题目给你一个二叉树的根节点root,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false题解、前序遍历+递归不仅要判断节点带值的情况,还要考虑空节点位置是否相同clas......
  • 如何求函数的对称中心和对称轴|探究拓宽
    预备知识1、多项式函数\(y=f(x)=ax^4+bx^3+cx^2+dx+e\)为奇函数的充要条件是\(a=c=e=0\).分析:由于函数\(f(x)\)为奇函数,故有\(f(-x)+f(x)=0\)恒成立,即\(\bigg[a(-x)^4+b(-x)^3+c(-x)^2+d(-x)+e\bigg]\)\(+\)\(\bigg(ax^4+bx^3+cx^2+dx+e\bigg)=0\)恒成立,即\(2a\cdotx......
  • C#.NET 国密SM4 CBC 对称加解密 与JAVA互通 ver:20231103
    C#.NET国密SM4CBC对称加解密与JAVA互通ver:20231103 .NET环境:.NET6控制台程序(.netcore)。JAVA环境:JAVA8,带maven的JAVA控制台程序。 简要解析:1:加密的KEY、明文等输入参数都需要string转byte[],要约定好编码,如:UTF8。2:加密后的输出参数:byte[],在传输时需要转......
  • kettle/ckettle进行参数对称加解密-AES为例
    ckettle/kettle字段加密对称加密机制方法调用链kettle-core-2.3.0.1-SNAPSHOT.jar:进行秘钥加密保护(不涉及实际业务处理) org.pentaho.di.core.encryption.Encr org.pentaho.di.core.encryption.TwoWayPasswordEncoderInterface 使用BigInteger进行或运算来进行秘钥加密解......
  • 关于二叉树中三种深度遍历方式的理解
    今日刷题,538.把二叉搜索树转换为累加树。明确知道利用二叉搜索树中序遍历的情况下是有序数组这一个特点,进行“逆中序”来累加。但是在递归时却还是有些没有搞清楚一些细节,终究还是没有掌握。问题主要还是在于递归返回值的处理上:在中序遍历的情况下,似乎对于左右两个节点的遍历,不......
  • 104.二叉树的最大深度
    目录题目法一、后序遍历法二、层序遍历题目给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。示例1:输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2法一、后序遍历后序遍历......
  • [Leetcode] 0111. 二叉树的最小深度
    111.二叉树的最小深度题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。 示例1:输入:root=[3,9,20,null,null,15,7]输出:2示例2:输入:root=[2,null,3,null,4,null,5,null,6]输......
  • 代码随想录训练营第二十天打卡(Python)| 654.最大二叉树 、617.合并二叉树 、700.二叉搜
    654.最大二叉树1、使用切片classSolution:defconstructMaximumBinaryTree(self,nums:List[int])->Optional[TreeNode]:iflen(nums)==0:returnNonemax_val=max(nums)max_index=nums.index(max_val)node=T......
  • 代码随性训练营第十七天(Python)| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之
    110.平衡二叉树1、递归法classSolution:defisBalanced(self,root:Optional[TreeNode])->bool:ifself.get_height(root)!=-1:#-1代表高度差大于1returnTrueelse:returnFalsedefget_height(self,root):......