【力扣/牛客刷题】二叉树篇

news2024/11/27 21:01:06

作者:✿✿ xxxflower. ✿✿
博客主页:xxxflower的博客
专栏:【力扣、牛客刷题】篇
语录:⭐每一个不曾起舞的日子,都是对生命的辜负。⭐

文章目录

  • 100. 相同的树
  • 572. 另一棵树的子树
  • 226. 翻转二叉树
  • 平衡二叉树
  • 101.对称二叉树
  • 层序遍历
  • 二叉树的遍历

100. 相同的树

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p ==null && q == null){
            return true;
        }
        if(p ==null || q == null){
            return false;
        }if(p.val == q.val){
            return isSameTree(p.left,q.left) &&
            isSameTree(p.right,q.right);
        }else{
            return false;
        }
    }
}

572. 另一棵树的子树

题目oj:572. 另一棵树的子树
在这里插入图片描述
本题采用子问题思路。先判断root是否为空的情况,然后判断两棵树是否为相同的树,判断subRoot是不是root.left的子树,判断subRoot是不是root.right的子树。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root == null || subRoot == null){
            return false;
        }
        //1.判断两棵树是否为相同的树
        if(isSameTree(root,subRoot)){
            return true;
        }
        //2.判断subRoot是不是root.left的子树
        if(isSubtree(root.left,subRoot)){
            return true;
        }
        //3.判断subRoot是不是root.right的子树
        if(isSubtree(root.right,subRoot)){
            return true;
        }
        return false;
    }
   public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p ==null && q == null){
            return true;
        }
        if(p ==null || q == null){
            return false;
        }if(p.val != q.val){
            return false;
        } return isSameTree(p.left,q.left) &&
            isSameTree(p.right,q.right);
    }
}

226. 翻转二叉树

题目oj:226. 翻转二叉树
在这里插入图片描述
要翻转整棵树,实际上是翻转整棵树的左树和右树。
1.翻转左树和右树
2.处理root.left的子树
3.处理root.right的子树

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root != null){
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
        invertTree(root.left);
        invertTree(root.right);
        }
        return root;
    }
}

平衡二叉树

题目oj:110.平衡二叉树
在这里插入图片描述
思路1:要想判断一棵树是否为平衡二叉树,我们可以判断跟节点的左数高度和右树高度。查找每一个节点的左树高度和右树高度然后相减求绝对值,如果绝对值小于2,那么证明这个节点是平衡的。

class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root == null){
            return true;
        }
        int leftHeigh = isHeight(root.left);
        int rightHeigh = isHeight(root.right);
        return Math.abs(leftHeigh-rightHeigh) < 2 
        && isBalanced(root.left)
        && isBalanced(root.right);
    }
    public int isHeight(TreeNode root){
        if(root == null){
            return 0;
        }
        int lHeigh = isHeight(root.left);
        int rHeigh = isHeight(root.right);
        if(lHeigh >= 0 && rHeigh >= 0 
        &&Math.abs(lHeigh - rHeigh) <= 1){
            return Math.max(lHeigh,rHeigh)+1;
        }else{
            return -1;
        }
    }
}

由思路可以得到,最坏的结果是每一个节点都要计算一次其左右子树的高度,所以这种思路的时间复杂度达到了O(N²)。那么有没有一种方法让实践复杂度为O(N)就可以达到呢?那么我们来看一下思路二:在判断根结点左子树和右子树是否平衡的时候,我们可以标记一下,如果左树的高减右树的高度大于2时,则此树一定不是平衡二叉树,那么返回-1;(注意:假如左子树求出来的值是-1,右子树是0,这种情况下也不属于平衡二叉树,所以注意条件的书写)

class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root == null){
            return true;
        }
        return isHeight(root) >= 0;
    }
    public int isHeight(TreeNode root){
        if(root == null){
            return 0;
        }
        int lHeigh = isHeight(root.left);
        int rHeigh = isHeight(root.right);
        if(lHeigh >= 0 && rHeigh >= 0 
        &&Math.abs(lHeigh - rHeigh) <= 1){
            return Math.max(lHeigh,rHeigh)+1;
        }else{
            return -1;
        }
    }
}

101.对称二叉树

题目oj:对称二叉树
在这里插入图片描述
在这里插入图片描述
如图所示,要想判断一棵树是否对称,先判断一下根结点是否为空。再判断左子树和右子树的值是否相同。此处的相同有两种情况,即结构相同和数值相同。数值相同又分为两种情况:即左子树的左端的值和右子树右端的值相同,左子树右端的值和右子树左端的值相同。代码如下:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null){
            return true;
        }
        return isSymmetricChild(root.left,root.right);
    }
    private boolean isSymmetricChild(TreeNode leftNode,TreeNode rightNode){
        if(leftNode == null && rightNode != null
         ||leftNode != null && rightNode == null){
             return false;
        }
        if(leftNode == null && rightNode == null){
            return true;
        }
        if(leftNode.val != rightNode.val){
            return false;
        }
        return isSymmetricChild(leftNode.left,rightNode.right)
        && isSymmetricChild(leftNode.right,rightNode.left);
    }
}

思考:如果有两棵树,如下图,那么如何判断他们两个是否为镜像对称?
在这里插入图片描述

class Solution6 {
        public boolean isSymmetricTwo(TreeNode root1,TreeNode root2) {
            if(root1 == null && root2 == null){
            return true;
        }
        if(root1 == null && root2 != null || root1 != null && root2 == null){
            return false;
        }
        if(root1.val != root2.val){
            return false;
        }
        return isSymmetricTwo(root1.left,root2.right) &&
                isSymmetricTwo(root1.right,root2.left);
        }
    }

层序遍历

关于层序遍历,我们前文有过讲解。但是不一样的是本题的返回值是List<List>
题目oj:二叉树的层序遍历
在这里插入图片描述

思路:现将A放入队列中,然后判断队列是否为空?不为空的话获取一下队列的大小size,根据size的大小确定往list当中放入元素的多少,此处可以用循环。然后弹出A给cur,size–,再将cur的值添加到list当中。如果cur的左边不为空,则放入到队列中,右边同理。size为0,此循环结束.再判断队列是否为空。。。。
在这里插入图片描述

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> list = new ArrayList<>();
        if(root == null){
            return list;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(! queue.isEmpty()){
           int size = queue.size();
           List<Integer> tmp = new ArrayList<>();
           while(size > 0){
               TreeNode cur = queue.poll();
               size--;
               tmp.add(cur.val);
               if(cur.left != null){
                   queue.offer(cur.left);
               }
               if(cur.right != null){
                   queue.offer(cur.right);
               }
           }
           list.add(tmp);
        }
        return list;
    }
}

二叉树的遍历

题目oj:二叉树的遍历
在这里插入图片描述
从题中可以得出,这是先序遍历,那么我们要采用先序遍历的思想去解决问题。
在这里插入图片描述

import java.util.Scanner;
class TreeNode{
    public char val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(char val){
        this.val = val;
    }
}
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String str = in.nextLine();
            TreeNode root = createTree(str);
            //中序遍历二叉树
            inOder(root);
        }
    }
    private static void inOder(TreeNode root){
        if(root == null){
            return;
        }
        inOder(root.left);
        System.out.print(root.val + " ");
        inOder(root.right);
    }
    private static int i = 0;
    private static TreeNode createTree(String str){
        TreeNode root = null;
        if(str.charAt(i) != '#'){
            root = new TreeNode(str.charAt(i));
            i++;
            root.left = createTree(str);
            root.right = createTree(str);
        }else{
            i++;
        }
        return root;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++11之后的decltype类型指示符

C11之后的decltype类型指示符一、什么是decltype类型指示符二、typeid运算符三、使用decltype指示符四、decltype和引用五、decltype(auto)六、本章代码汇总一、什么是decltype类型指示符 有时会遇到这种情况&#xff1a;希望从表达式的类型推断出要定义的变量的类型&#xff…

深度对比学习综述

本文综合考察了对比学习近年的发展和进步, 提出一种新的面向对比学习的归类方法, 并基于提出的归类方法, 对现有对比研究成果进行系统综述, 并评述代表性方法的技术特点和区别, 系统对比分析现有对比学习方法在不同基准数据集上的性能表现。 摘要 在深度学习中, 如何利用大量、…

Linux - 目录与文件操作

目录1.操作目录1.1 目录切换1.2 浏览目录1.3 目录创建1.4 目录删除1.5 复制目录1.6 移动或重命名目录2. 操作文件2.1 查找文件2.2 查看文件信息2.3 查看文件内容2.4 创建文件2.5 文件修改-vim2.6 删除文件2.7 复制和重命名文件3. 文件或目录进行压缩或解压3.1 压缩3.2 解压1.操…

链路追踪工具之Zipkin

Zipkin是一个分布式跟踪系统&#xff0c;Zipkin的设计是基于谷歌的Google Dapper论文&#xff0c;它可以帮助收集时间数据&#xff0c;在microservice架构下&#xff0c;通过链路追踪&#xff0c;可以便捷的分析服务调用延迟问题。每个应用程序向Zipkin server端报告数据&#…

【高光谱、多光谱和全色图像融合】

HyperFusion: A Computational Approach for Hyperspectral, Multispectral, and Panchromatic Image Fusion &#xff08;超融合&#xff1a;高光谱、多光谱和全色图像融合的计算方法&#xff09; 高空间分辨率的高光谱图像&#xff08;HSI&#xff09;和多光谱图像&#xff…

链表热门面试题(二)

目录前言一、删除链表的倒数第 N 个结点二、两两交换链表中的节点三、旋转链表四、删除排序链表中的重复元素五、删除排序链表中的重复元素 II六、反转链表II七、删除链表中的节点八、奇偶链表前言 一、删除链表的倒数第 N 个结点 题目&#xff1a; 方法1&#xff1a;找到删除…

【Java多线程】创建多线程方式一

线程的创建和启动 *Java语言的JVM允许程序运行多个线程&#xff0c;它通过java.lang.Thread类来体现。 *Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的&#xff0c;经常 把run()方法的主体称为线程体 通过该Thread对象的start()方法来启动这个…

判断两条线段是否相交

参考链接&#xff1a; 1 2 一、判断线段是否相交需要下面两步&#xff1a; &#xff08;1&#xff09;快速排斥实验 &#xff08;2&#xff09;跨立实验 二、第一步快速排斥实验 对上图两条L1,L2线段来说&#xff0c;L1 x的最大值为d端点x5&#xff0c;L2 x的最小值为a端点x…

RobotFramework环境安装和入门

环境安装1、安装python建议版本3.7&#xff0c;Robot Framework不支持python最新版。 可以通过以下地址下载https://www.python.org/ftp/python/3.7.3/python-3.7.3-amd64.exe安装过程中选择添加到环境变量。2、安装Robot Framework以及所需组件注意各个组件的版本号&#xff0…

LVGL学习笔记15 - 文本框TextArea

目录 1. Parts 2. 样式 2.1 修改背景bg 2.2 修改边界border 2.3 修改文本 2.3.1 lv_textarea_add_char 2.3.2 lv_textarea_add_text 2.3.3 lv_textarea_set_text 2.3.4 设定可输入的字符 2.3.5 删除字符 2.3.6 设定字符串最大长度 2.4 滚动条 2.4.1 滚动方向 2.4.2 …

RHCE学习笔记-133-1

RH133-01 installation 光盘引导后,在提示符下输入:linux askmethod 可以支持:local cdrom,hard drive,nfs image,ftp,http方式 cpu on x86 2个物理超线程CPU 使用smp or hugemem kernel可以支持 32个物理cpus 内存 标准x86 kernel 4G smp i686/athlon kernel 16G hugemem SMP …

创建新分支,基于某一分支创建新分支,git push --set-upstream origin

背景&#xff1a; 基于hcc1.2的开发分支拉去hcc_hotfix_1.2.0分支&#xff0c;解读&#xff1a;在仓库中基于某个分支&#xff0c;创建一个新的分支 做法&#xff08;解决&#xff09;&#xff1a; 1、第一步&#xff1a;git branch hcc_hotfix_1.2.0 2、第二步&#xff1a;g…

葡萄城邀您参与「表格技术开发者新年分享会」,共话表格技术新未来!

数据资产是企业最重要的资产之一&#xff0c;表格也是企业最普遍的数据整理手段。在数字经济时代&#xff0c;各行业飞速发展&#xff0c;拥抱数字化、进行数字化升级已成为大势所趋&#xff0c;企业对协同办公、大数据分析、表格智能化应用等领域的需求也呈爆发式增长&#xf…

GrapeCity Documents Image Viewer JavaScript Crack

GrapeCity Documents Image Viewer 是跨平台 JavaScript 图像查看器 允许用户使用我们的 JavaScript 图像查看器在您的 Web 应用程序中查看和编辑图像。采集 by Ω578867473 支持多种图像格式 适用于所有现代浏览器和框架&#xff0c;包括 Edge、Chrome、Firefox、Opera、Saf…

【UE4 第一人称射击游戏】33-创建一个小地图

上一篇&#xff1a;【UE4 第一人称射击游戏】32-添加击杀AI的提示功能&#xff08;使用到控件蓝图的动画功能&#xff09;本篇效果&#xff1a;可以看到左上角完成了小地图的制作步骤&#xff1a;打开名为“FPSHUD”的控件蓝图&#xff0c;拖入一个图像控件&#xff0c;表示迷你…

Diffusion 和Stable Diffusion的数学和工作原理详细解释

扩散模型的兴起可以被视为人工智能生成艺术领域最近取得突破的主要因素。而稳定扩散模型的发展使得我们可以通过一个文本提示轻松地创建美妙的艺术插图。所以在本文中&#xff0c;我将解释它们是如何工作的。 扩散模型 Diffusion 扩散模型的训练可以分为两部分: 正向扩散→在图…

输出全排列(C++版)

目录 输出全排列 一、问题描述 二、运行环境说明 ​三、代码段 四、效果展示 输出全排列 备注&#xff1a;大二&#xff08;上&#xff09;数据结构课程设计A题 一、问题描述 请编…

我是如何利用cps平台赚钱的?

你好&#xff0c;我是你们熟悉而又陌生的好朋友梦龙&#xff0c;一个创业期的年轻人 今天跟你做个分享&#xff0c;众所周知互联网是一块非常大的蛋糕&#xff0c;几位互联网巨头也做不到完全吃透&#xff0c;这次梦龙给你分享的是实际的经验&#xff0c;实际的案例分享。 最开…

Spring存储和读取对象 -- 2

Spring存储和读取对象 -- 2前言一、存储 Bean 对象1.1 前置工作&#xff1a;配置扫描路径 (重要)1.2 添加注解存储 Bean 对象1.2.1 五大类注解Bean 命名规则1.2.2 方法注解 BeanBean 命名规则与重命名二、获取 Bean 对象 (对象注入)2.1 属性注入优点分析缺点分析2.2 Setter 注入…

如何在Jetbrain Rider中使用EntityFrameWork (Core) 命令行,如添加迁移和更新数据库

在Visual Studio中&#xff0c;EntityFrameWork命令如Add-Migration和Update-Database通常在包管理器控制台中运行。这在Visual Studio中工作得很好&#xff0c;但不幸的是&#xff0c;它不是可移植的。这些命令是基于powershell的&#xff0c;并且包管理器控制台绑定了Visual …