【二叉树】常见题目解析(2)

news2024/11/19 5:48:55

题目1:104. 二叉树的最大深度 - 力扣(LeetCode)

题目1描述:

题目1分析及解决:

        (1)base case:当前节点为null时,以当前节点为根节点的树最大深度是0。

        (2)节点不为null时,节点应该统计左右子树的最大深度,并在其中取一个最大值 + 1即可得到以当前节点为根节点的树最大深度是多少(+ 1是因为当前节点也算一个深度)。

        (3)既然要用到左右子树的递归结果,那么肯定是后序遍历整颗树。

        Code:

class Solution {
    public int maxDepth(TreeNode root) {
        //空树最大深度为0
        if(root == null)
        return 0;
        
        //获取左右子树的最大深度
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
        
        //在左右子树的结果中选一个较大值 + 1(当前节点也算一个深度)
        return Math.max(leftDepth,rightDepth) + 1;
    }
}

题目2:111. 二叉树的最小深度 - 力扣(LeetCode)

题目2描述:

题目2分析与解决:

        (1)base case:当前节点为null时,最小深度是0;当节点的左、右子节点都为null时,说明当前节点是叶子节点,最小深度是1.

        (2)节点不为null时,如果当前节点的左节点不为null,就获取左节点的最小深度;如果当前节点的右节点不为null,就获取右节点的最小深度;最后在左、右子节点返回的结果中选一个较小值 + 1即可得到以当前节点为根节点的树最小深度是多少。

        (3)由于还是要获取左、右子节点的返回结果,所以仍然是后序遍历。为什么要在左、右子节点不为null时,才能去递归获取他们的最小深度呢?看下图

        总结:不加if判断会被空节点影响最终结果。

        Code:

class Solution {
    public int minDepth(TreeNode root) {
        //节点为null时,最小深度是0
        if(root == null)
        return 0;
        
        //节点为叶子节点时,最小深度是1
        if(root.left == null && root.right == null)
        return 1;

        int leftDepth = Integer.MAX_VALUE;
        int rightDepth = Integer.MAX_VALUE;

        if(root.left != null)
        leftDepth = minDepth(root.left);

        if(root.right != null)
        rightDepth = minDepth(root.right);

        return Math.min(leftDepth,rightDepth) + 1;
    }
}

题目3:958. 二叉树的完全性检验 - 力扣(LeetCode)

题目3描述:

题目3分析与解决:

        (1)完全二叉树的特点如下图所示:

        (2)逐层遍历每一个节点(bfs),当一个节点的左子节点为null而右子节点不为null时,说明不是完全二叉树。

        (3)当遍历到一个节点,它的左、右子结点有一个为null,若后续节点不是叶子节点,说明不是完全二叉树。如下图所示,遍历到a节点时,其左子节点不为null、右子节点为null;后面遍历b节点时,如果b是叶子节点,则不破坏完全二叉树的性质,如果b不是叶子节点,则中间有空缺,不符合完全二叉树的定义。

        Code:

class Solution {
    
    //题目规定节点个数在100以内
    public static int MAX = 101;    
    
    //用数组模拟队列
    public static TreeNode [] queue = new TreeNode[MAX];

    //用head、tail两个变量维护队列的长度及出入队顺序
    public static int head,tail;
    public boolean isCompleteTree(TreeNode root) {
        //空树也是完全二叉树
        if(root == null)
        return true;

        //初始队列大小为0
        head = tail = 0;

        //根节点入队
        queue[tail++] = root;
        
        //标记变量:遍历到一个节点,只要它的左、右子节点有一个为null,就设置为true
        boolean flag = false;

        //队列不为空
        while(head < tail){
            //弹出队头节点
            TreeNode node = queue[head++];
            
            //返回false的两个条件,满足一个即可
            //1.左子节点为null的同时右子节点不为null
            //2.有节点设置flag为true的同时当前节点不是叶子节点
            if((node.left == null && node.right != null) ||
                (flag && (node.left != null || node.right != null))
            )
                return false;

            if(node.left != null)
            queue[tail++] = node.left;

            if(node.right != null)
            queue[tail++] = node.right;

            if(node.left == null || node.right == null)
            flag = true;
        }
            //如果逐层遍历过程中没有返回false,那么这棵树是完全二叉树,返回true
            return true;
    }
}

题目4:222. 完全二叉树的节点个数 - 力扣(LeetCode)

题目4描述:

题目4分析与解决:

        (1)最基本的思路是:递归左、右子树获取他们的节点个数,当递归到叶子节点时,就返回1(叶子节点的左、右子节点都为null),每层节点收集左、右子树的递归结果再 + 1(当前结点也算一个结点)返回即可。

        (2)基于上述思路无论是什么类型的二叉树都能统计其结点个数,但题目强调了是一颗完全二叉树,我们该如何利用这一性质?根据题目3我们知道,一颗完全二叉树不一定是一颗满二叉树,但它一部分的子树一定是一颗满二叉树;利用这一性质,当我们发现以当前结点为根节点的树是满二叉树时,直接计算结点个数返回,无需获取左、右子树的递归结果,减少时间复杂度

        (3)一颗满二叉树的结点个数如何计算呢? 不就是2^层数 - 1吗? 所以当我们递归到一个结点时,我们首先判断它是否是一颗满二叉树,是则直接计算结点个数;不是,则递归左、右子树,获取左、右子树的递归结果,再+1即可。

        Code:

class Solution {
    public int countNodes(TreeNode root) {
        //空结点肯定不算一个结点
        if(root == null)
        return 0;

        TreeNode l = root.left;
        int leftDepth = 0;
        //一直往左树遍历,看最深是多少
        while(l != null){
            l = l.left;
            leftDepth++;
        }
        TreeNode r = root.right;
        int rightDepth = 0;
        //一直往右树遍历,看最深是多少
        while(r != null){
            r = r.right;
            rightDepth++;
        }
        
        //如果左、右子树的深度相同
        //说明以当前结点为根节点的树是一颗满二叉树,直接计算结点个数并返回
        if(leftDepth == rightDepth)
        return (2 << leftDepth) - 1;
        else
        //否则获取左、右子树的递归结果 + 1 返回
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}

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

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

相关文章

深入理解前端路由:构建现代 Web 应用的基石(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

skywalking 9.0.0开启自监控和配置集群

一、skywalking介绍 SkyWalking是有国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目&#xff0c;2017年12月SkyWalking成为Apache国内首个个人孵化项目&#xff0c;2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目&#xff0c;目前SkyWalking支持Java、…

如何快速看懂市场行情?

一、看大盘指数 咱们平时所说的大盘其实指的就是上证指数&#xff0c;它是整个市场的晴雨表。大盘涨了&#xff0c;个股跟着上涨的概率就大&#xff0c;大盘跌了&#xff0c;个股被拖累下跌的概率也大。所以&#xff0c;要想在股市中尝到甜头&#xff0c;大盘分析是少不了滴&am…

git的基本命令操作超详细解析教程

Git基础教学 1、初始化配置2、初始化仓库3、工作区域和文件状态4、添加和提交文件5、git reset 回退版本6、git diff查看差异7、删除文件git rm8、.gitignore9、本地文件提交到远程仓库10、分支基础 Git&#xff1a;一个开源的分布式版本控制系统&#xff0c;它可以在本地和远程…

网络安全应急响应-Server2228(环境+解析)

网络安全应急响应 任务环境说明: 服务器场景:Server2228(开放链接)用户名:root,密码:p@ssw0rd123

2023第十二届“认证杯”数学中国数学建模国际赛赛题A完整解析

A题完整题解 写在前面假设数据预处理 问题一1 基于自适应ARIMA-BP神经网络模型的影响因素预测1.1 ARIMA模型的建立1.2 BP神经网络模型的建立1.3 基于GABP神经网络的预测模型构建1.4 自适应混合ARIMA-BP神经网络模型的建立1.5 模型求解 代码Q1_1.mQ1_2.m 完整代码与论文获取 写在…

Android 应用程序无响应定位ANR原因

废话不多说&#xff0c;直接上方案&#xff1a; 第一步&#xff1a; 执行adb命令 adb bugreport /Users/mac/Desktop/anr 解压后FS/data/anr下就会有相关anr文件 /Users/mac/Desktop/anr 是电脑存储文件的路径&#xff0c;可以随便定义&#xff0c;这个没有影响。我的电脑是…

RHCSA学习笔记(RHEL8) - Part2.RH134

Chapter Ⅰ 提高命令行生产率 SHELL脚本 #/bin/bash声明使用的shell翻译器 for循环 for VAR in LIST doCOMMAND1COMMAND2 done实验1&#xff1a;显示host1-5 #! /bin/bash for host in host{1..5} doecho $host done实验2&#xff1a;显示包含kernel的软件包安装时间 #! /…

【微服务 SpringCloudAlibaba】实用篇 · Gateway服务网关

微服务&#xff08;8&#xff09; 文章目录 微服务&#xff08;8&#xff09;1. 为什么需要网关2. gateway快速入门1&#xff09;创建gateway服务&#xff0c;引入依赖2&#xff09;编写启动类3&#xff09;编写基础配置和路由规则4&#xff09;重启测试5&#xff09;网关路由的…

linux 内核工作队列技术原理

首先介绍一下工作队列使用的术语。 work&#xff1a;工作&#xff0c;也称为工作项。work queue&#xff1a;工作队列&#xff0c;就是工作的集合&#xff0c; work queue 和 work 是一对多的关系。worker&#xff1a; 工人&#xff0c; 一个工人对应一个内核线程&#xff0c;…

助力android面试2024【面试题合集】

转眼间&#xff0c;2023年快过完了。今年作为口罩开放的第一年大家的日子都过的十分艰难&#xff0c;那么想必找工作也不好找&#xff0c;在我们android开发这一行业非常的卷&#xff0c;在各行各业中尤为突出。android虽然不好过&#xff0c;但不能不吃饭吧。卷归卷但是还得干…

什么是美颜SDK?市面常用直播美颜SDK的技术比较

直播平台美颜技术其中的核心就是美颜SDK。本文将深入探讨什么是美颜SDK&#xff0c;以及市面上常用的直播美颜SDK的技术比较。 一、美颜SDK简介 美颜SDK&#xff0c;使开发者能够在其应用或平台中集成美颜特效。对于直播平台而言&#xff0c;美颜SDK的引入旨在提供实时、高质…

LabVIEW在调用image.cpp或drawmgr.cpp因为DAbort而崩溃

LabVIEW在调用image.cpp或drawmgr.cpp因为DAbort而崩溃 出现下列问题&#xff0c;如何解决&#xff1f; 1. LabVIEW 程序因image.cpp或drawmgr.cpp中的错误而崩溃 2. 正在通过cRIO-9034运行独立的LabVIEW应用程序&#xff0c;但它因drawmgr.cpp中的错误而崩溃 …

利用reddit的api进行爬虫

1 介绍 Reddit是一个社交新闻聚合网站&#xff0c;用户可以发布、评价和讨论各种话题。Reddit的内容涵盖了广泛的主题&#xff0c;可以从中获取大量的文本数据进行情绪分析。 2 注册 2.1 注册reddit 你需要先注册一个reddit的账号。 2.2 注册api https://www.reddit.com/…

微服务架构:解析分布式系统的演进

目录 微服务是什么&#xff1f; 微服务的优势 微服务的挑战 应对微服务挑战的方法 结论 在当今快速发展的软件开发领域&#xff0c;微服务架构成为一种备受瞩目的设计理念&#xff0c;被广泛应用于构建灵活、可扩展的分布式系统。本文将深入探讨什么是微服务&#xff0c;为…

LeetCode困难题(分发糖果--接雨水)

分发糖果 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回…

线性回归既是一种数据挖掘与建模算法,也是统计学领域、计量经济学领域的常用学术建模方法,有何不同?

一.线性回归的基本形式 线性回归既是一种数据挖掘与建模算法&#xff0c;也是统计学领域、计量经济学领域的常用学术建模方法。在数据挖掘与建模领域&#xff0c;线性回归算法是一种较为基础的机器学习算法&#xff0c;其基本思想是将响应变量&#xff08;因变量、被解释变量&…

MySQL安全相关——TDE和数据脱敏功能介绍

MySQL作为一款广泛使用的开源关系型数据库管理系统(RDBMS)&#xff0c;其安全性一直是开发者和企业关注的重点。在MySQL中&#xff0c;有一些与安全相关的功能&#xff0c;其中包括Transparent Data Encryption(TDE)和数据脱敏。本文将对这些功能进行介绍。 一、Transparent Da…

使用 kubeadm 部署 Kubernetes 集群(二)k8s环境安装

一、安装containerd 安装 k8s 有几种方式&#xff1a; 1、 Kubeadm 2、 二进制 这两个是 k8s 官网提供的方式&#xff0c;也是生产环境用的还可以借助第三方平&#xff1a;rancher、kubesphere 都可以装 k8s 这里使用 kubeadm 1.安装 containerd 在 Kubernetes 集群中&#…