代码随想录算法训练营 DAY 16 | 104.二叉树最大深度 111.二叉树最小深度 222.完全二叉树的节点个数

news2024/11/15 12:55:35

104.二叉树最大深度

深度和高度

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)

前序求的就是深度,用后序求的是高度。

在这里插入图片描述

根节点的深度,其实就是这棵树的最大高度!

  • 整体思路:按照后序遍历左右中的顺序,依次遍历每个节点,把它的高度返回给上一层父节点!最后回到根节点时就掌握了所有节点的高度信息!

递归法

递归三部曲:

  • 确定递归函数返回值和参数
int getHeight(TreeNode node)
  • 确定终止条件:
if(node == null) return 0;
  • 确定单层递归的逻辑

按照后序遍历左 右 中的顺序依次处理。每次返回给父节点(中)的时候 就代表了当前根节点的最大高度!!

int leftHeight = getHeight(node.left);  //左
int rightHeight = getHeight(node.right);  //右
int maxHeight = 1 + Math.max(leftHeight, rightHeight);

在这里插入图片描述

  • java代码
class Solution {
    public int getHeight(TreeNode node) {  //后序遍历
        if(node == null) return 0;  //结束条件
        int leftHeight = getHeight(node.left);  //左
        int rightHeight = getHeight(node.right);  //右
        int maxHeight = 1 + Math.max(leftHeight, rightHeight);
        return maxHeight;
    }

    public int maxDepth(TreeNode root) {
        return getHeight(root);
    }
}
  • 精简版
class solution {
public int maxDepth(TreeNode root) {
        if (root == null) return 0;
        return 1 + Math.Max(maxDepth(root.left), maxDepth(root.right));
    }
};

559.n叉树的最大深度

把左和右递归遍历的操作放到一个for循环里,遍历node.children 得到depth,最后return depth+1即可!

class Solution {
    public int getHeight(Node node) {
        if(node == null) return 0;
        int depth = 0;
        for(Node cur : node.children) {
            depth = Math.max(depth, getHeight(cur));
        }
        return 1 + depth;
    }

    public int maxDepth(Node root) {
        return getHeight(root);
    }
}

111.二叉树最小深度

前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。这里我们用后序。

明确题目定义!叶子节点是指左右孩子都为null的节点,因此我们在计算depth时就要添加条件判断,分别判断左为空右不为空左不为空右为空左右都不空的情况来计算当前最小深度!

后序遍历是左右中,从最底层开始一层层往上传递到根节点。

在这里插入图片描述

后序 递归

递归三部曲:

  • 确定递归函数返回值和参数
int getHeight(TreeNode node)
  • 确定终止条件:
if(node == null) return 0;
  • 确定单层递归的逻辑

分成三种情况:左为空右不为空左不为空右为空左右都不空。然后return 接收到的最小高度+1

int leftHeight = getHeight(node.left);
        int rightHeight = getHeight(node.right);
        if(node.right == null && node.left != null) return 1 + leftHeight;
        else if(node.left == null && node.right != null) return 1 + rightHeight;
        else {  //左右都不为空
            return 1 + Math.min(leftHeight, rightHeight);
        }
  • java代码
class Solution {
    int getHeight(TreeNode node) {
        if(node == null) return 0;
        int leftHeight = getHeight(node.left);
        int rightHeight = getHeight(node.right);
        if(node.right == null && node.left != null) return 1 + leftHeight;
        else if(node.left == null && node.right != null) return 1 + rightHeight;
        else {  //左右都不为空
            return 1 + Math.min(leftHeight, rightHeight);
        }
    }

    public int minDepth(TreeNode root) {
        return getHeight(root);
    }
}

222.完全二叉树的节点个数

普通做法

直接把它当成是一棵普通二叉树,遍历的过程中记录节点数量。递归的话还是用后序(左右中)

  • 时间复杂度:O(n)
  • 空间复杂度:O(log n),算上了递归系统栈占用的空间

完全二叉树做法

完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

在这里插入图片描述

我们能不能利用完全二叉树的特性,不要去遍历所有的节点呢?只遍历一部分节点就能判断?

  • 核心思路:利用完全二叉树特性,因为题目是完全二叉树,直接全部遍历左孩子和右孩子,如果高度相等它就是满二叉树,直接return 2^树深度 - 1个节点。内侧的节点就不用遍历了!

  • 在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。

递归三部曲

终止条件:==null或者为满二叉树的情况

 //终止条件
        if(root == null) return 0;
        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftHeight = 0, rightHeight = 0;  //计数从0开始
        while(left != null) {
            left = left.left;
            leftHeight += 1;
        } 
        while(right != null) {
            right = right.right;
            rightHeight += 1;
        }
        if(leftHeight == rightHeight) return (2 << leftHeight) - 1; 
  • 单层递归逻辑
return countNodes(root.left) + countNodes(root.right) + 1;
  • 完整代码
class Solution {
    public int countNodes(TreeNode root) {
        //终止条件
        if(root == null) return 0;
        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftHeight = 0, rightHeight = 0;  //计数从0开始
        while(left != null) {
            left = left.left;
            leftHeight += 1;
        } 
        while(right != null) {
            right = right.right;
            rightHeight += 1;
        }
        if(leftHeight == rightHeight) return (2 << leftHeight) - 1; 
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}
  • 时间复杂度:O(log n × log n)
  • 空间复杂度:O(log n)

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

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

相关文章

按键模拟精灵

按键模拟精灵功能简单&#xff1a; 1.添加模拟按键 2.删除模拟按键 3.开始模拟 4.停止模拟 适合简单的按键操作&#xff0c;有需要的可以点赞收藏关注我&#xff01;

315晚会:虚假的水军是怎样形成的?又要如何破解?

随着互联网的普及和发展&#xff0c;网络信息的传播已经成为了现代社会中不可或缺的一部分。然而&#xff0c;随之而来的是网络舆论的泛滥和虚假信息的肆意传播&#xff0c;这使得网络治理变得尤为重要。 2024年的315晚会&#xff0c;央视曝光了一种新型的水军制造手段&#x…

DXF™ 格式对象和图元——cad vba

在 DXF™ 格式中&#xff0c;对象的定义与图元的定义不同&#xff1a;对象没有图形表示&#xff0c;而图元则有图形表示。例如&#xff0c;词典是对象而不是图元。图元也称为图形对象&#xff0c;而对象称为非图形对象。 第七段中humbnail image&#xff0c;即&#xff1a;缩略…

【智能算法】海洋捕食者算法(MPA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年&#xff0c;Afshin Faramarzi 等人受到海洋生物适者生存启发&#xff0c;提出了海洋捕食者算法(Marine Predators Algorithm&#xff0c;MPA)。 2.算法原理 2.1算法思想 MPA根据模拟自然界…

图神经网络实战(2)——图论基础

图神经网络实战&#xff08;2&#xff09;——图论基础 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图和非加权图1.3 连通图和非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前…

户外水质检测显示屏用于检测并显示各种水质数据

水质检测一直是环境保护和公共卫生领域的重要课题。随着科技的不断进步&#xff0c;水质检测设备也在不断更新换代。其中&#xff0c;水质检测显示屏作为一种新型的检测设备&#xff0c;为监测和显示各种水质数据提供了便利和高效的手段。 水质检测显示屏是一种集成了传感器、数…

tcp seq ack

seq&#xff08;Sequence Number&#xff09;&#xff1a;32bits&#xff0c;表示这个tcp包的序列号。tcp协议拼凑接收到的数据包时&#xff0c;根据seq来确定顺序&#xff0c;并且能够确定是否有数据包丢失。 ack&#xff08;Acknowledgment Number&#xff09;&#xff1a;3…

Python基础学习笔记(一)

Python简介 Python 语言是一种跨平台、开源、免费、解释型、面向对象、动态数据类型的高级程序设计语言。早期版本的 Python 被称作是 Python1&#xff1b;Python2 最后一个版本是 2.7&#xff1b;Python3 是目前最活跃的版 本&#xff0c;基本上新开发的 Python 代码都会支持…

Infoq:腾讯内容千亿级实时计算和规则引擎实践优化之路

1.系统背景 腾讯内容中台提供从内容生产、内容加工、内容分发、内容结算等全链路环节的一站式服务&#xff0c;在这个过程中&#xff0c;会产生大量的数据以及围绕这些数据衍生的实时流业务应用&#xff0c;如智能审核、运营决策、在线学习等&#xff0c;从底层去看这些内容生态…

SM4加密是什么?SM4算法在国密HTTPS协议中的作用

SM4加密算法是一种分组密码标准&#xff0c;由国家密码管理局于2012年3月21日发布&#xff0c;相关标准为“GM/T 0002-2012《SM4分组密码算法》&#xff0c;与国际上广泛使用的AES等算法类似&#xff0c;SM4同算法样用于保护数据的机密性&#xff0c;确保信息在传输过程中不被未…

MT1478 插入A(技巧)

从键盘上输入一个字符串&#xff08;长度小于10000&#xff0c;以回车作为结束&#xff0c;其余地方不出现回车&#xff09;&#xff0c;按后按照下面要求输出一个新字符串&#xff0c; 新的字符串是在原来字符串中&#xff0c; 每两个字符之间插入一个A&#xff0c; 输出新产生…

代码随想录|Day25|回溯05|491.非递减子序列、46.全排列、47.全排列II

491. 非递减子序列 本题并不能像 90.子集II 那样&#xff0c;使用排序进行树层去重。虽然题目没有明确不能排序&#xff0c;但如果排序了&#xff0c;集合本身就是递增子序列&#xff0c;这是LeetCode示例2中没有出现的。 所以本题的关键在于&#xff0c;如何在不排序的情况下对…

C语言数据结构基础——二叉树学习笔记(三)链式二叉树以及初步认识递归思想

1.链式二叉树概念及其逻辑 每个树都要看成&#xff1a;根&#xff0c;左子树&#xff0c;右子树 链表、顺序表中的遍历方式有正序遍历和逆序遍历&#xff0c;而我们在二叉树中&#xff0c;有前序遍历、中序遍历、后序遍历、层序等多种遍历方法。 所谓 二叉树遍历 (Traversal) …

linux网络固定ip的方式

1. 注意 默认情况下&#xff0c;我们linux操作系统 ip 获取的方式是自动获取的方式&#xff08;DHCP&#xff09;&#xff0c;自动获取在我们需要进行集群配置的时候&#xff0c;IP会经常变化&#xff0c;需要将IP固定下来。 2. 第一步 编辑我们 linux 的网卡文件 这个网卡文件…

Springmvc---解读<url-pattern/>

&#xff08;1&#xff09; *.do&#xff1a; 在没有特殊要求的情况下&#xff0c;SpringMVC 的中央调度器 DispatcherServlet 的<url-pattern/>常使用后辍匹配方式&#xff0c;如写为*.do 或者 *.action, *.mvc等。 &#xff08;2&#xff09; / &#xff1a; Tomcat本身…

敢为天下先!深圳市全力推动鸿蒙生态发展……程序员

3月19日&#xff0c;鸿蒙生态创新中心揭幕仪式在深圳正式举行。鸿蒙生态创新中心的建立是为构建先进完整、自主研发的鸿蒙生态体系&#xff0c;将深圳打造为鸿蒙生态策源地、集聚区的具体举措&#xff0c;也是推动我国关键核心技术高水平自立自强、数字经济高质量发展、保障国家…

面试算法-62-盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。…

7个方便快速使用的Tkinter控件源码分享,赶快收藏

文章目录 7个快速使用的Tkinter控件源码分享1. 按钮 Button2. 开关 Checkbutton3. 显示文本 Label4. 带名称、数值显示的划动条5. 带标签的复选框6. 带名称的输入框7. 带名称的微调框7个快速使用的Tkinter控件源码分享 tkinter 是一个简单入手,但是功能十分强大的GUI编程库,学…

谷歌DeepMind推出SIMA智能体,可以跟人一起玩游戏

谷歌 DeepMind 推出了 SIMA&#xff0c;这是一种通过训练学习游戏技能的人工智能代理&#xff0c;因此它玩起来更像人类&#xff0c;而不是一个只做自己事情的强大人工智能。 从早期与 Atari 游戏合作&#xff0c;到以人类大师级别玩《星际争霸 II》的 AlphaStar 系统&#xf…

算法设计与分析-动态规划算法的应用——沐雨先生

一、实验目的 1&#xff0e; 掌握动态规划算法的基本思想&#xff0c;包括最优子结构性质和基于表格的最优值计算方法。 2&#xff0e;熟练掌握分阶段的和递推的最优子结构分析方法。 3&#xff0e; 学会利用动态规划算法解决实际问题 。 二、实验内容 1. 问题描述 &#…