二叉树之二叉树的深度

article/2025/11/11 1:50:34

1.二叉树的max deep

1. 高度与深度

二叉树的高度: 任意一个节点到叶节点的max距离
深度: 任意一个节点到根节点的max距离
求深度: 后续 left right mid 先求子节点的深度,+1即为父节点深度
求高度 lef mid right +1 +1 +1逼近高度

2.求高度

1.递归思路
1+max(left,right)
递归函数 max f(root)
终止条件 if(root==null) return 0;
2.代码

 // 法1 递归public int maxDepth(TreeNode root) {if (root==null) return 0;int maxleft=maxDepth(root.left);int maxright=maxDepth(root.right);return Math.max(maxleft,maxright)+1;}

3. 为什么深度=高度

二叉树根节点的高度与树的最大深度相等,高度叶到当前节点,深度当前节点到根,高度后续,深度前序

法二: 层序遍历

 // 法二 层序遍历public int maxDepth02(TreeNode root) {if (root==null){return 0;}int dept=0;ArrayDeque<TreeNode> queue = new ArrayDeque<>();queue.offer(root);while (!queue.isEmpty()){int size=queue.size();// 一层元素的数量,来装下一层的元素for (int i = 0; i < size; i++) {TreeNode poll = queue.poll();if (poll.left!=null){queue.offer(poll.left);}if (poll.right!=null){queue.offer(poll.right);}}dept++;}return dept;}

3. 法三: 直接求深度

前序 中左右+回溯
先求中间节点深度,left深度=right深度=中间+1,此时求右节点时需要回溯(我写的代码自带回溯,dept+1后不变了)

// 法3 直接求深度  前序 中左右int maxDept=0;public void maxDepth03(TreeNode root,int dept) {// dept是当前节点高度if (root==null){return ;}maxDept= maxDept>dept ? maxDept : dept;dept++;// 子节点高度maxDepth03(root.left,dept);maxDepth03(root.right,dept);}public int maxDepth03(TreeNode root) {maxDepth03(root,1);return maxDept;}

2. 二叉树最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

111.二叉树的最小深度1

返回它的最小深度 2

1. 法一 递归

 public int minDepth(TreeNode root) {if (root==null){return 0;}int left = minDepth(root.left);int right = minDepth(root.right);if (root.left!=null&&root.right==null){return 1+left;}if (root.right!=null&&root.left==null){return 1+right;}return 1+Math.min(left,right);}

法二 层序遍历

  public int minDepth(TreeNode root) {if (root == null) {return 0;}int dept = 0;ArrayDeque<TreeNode> queue = new ArrayDeque<>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();// 一层元素的数量,来装下一层的元素dept++;for (int i = 0; i < size; i++) {TreeNode poll = queue.poll();if (poll.left == null && poll.right == null) {return dept;}if (poll.left != null) {queue.offer(poll.left);}if (poll.right != null) {queue.offer(poll.right);}}}return dept;}
}
```
在这里插入代码片
`
## 3. 判断平衡二叉树
### 1. 衡二叉树,左右子树高度相差<=1
1. height   f(node)  // 返回节点高度,当不是平衡二叉树,返回-1
2. if(node==null)  return 0;       
3. 单层
left=f(left)
if(left==-1) return -1; 剪枝
right=f(right)
if(rght==-1){return -1}return abs(left-right)<=1 ? Max(left+right)+1;// 29. 平衡二叉树public boolean isBalanced(TreeNode root) {int balancedDG = isBalancedDG(root);return balancedDG==-1 ? false : true;}//public int isBalancedDG(TreeNode root) {if (root == null) {return 0;}int left = isBalancedDG(root.left);if (left==-1){ //剪枝return -1;}int right = isBalancedDG(root.right);if(right==-1){ // 防 左子树为0,右子树一串return -1;  }return Math.abs(left-right)>1 ?-1 : Math.max(left,right)+1; }为什么right还要判断防
![在这里插入图片描述](https://img-blog.csdnimg.cn/782d32ebb4db49068bd89529bab63a08.jpeg)

http://chatgpt.dhexx.cn/article/C3BUP7rs.shtml

相关文章

二叉树的深度

二叉树的深度计算 1、一颗树只有一个节点&#xff0c;它的深度是1&#xff1b; 2、二叉树的根节点只有左子树而没有右子树&#xff0c;那么可以判断&#xff0c;二叉树的深度应该是其左子树的深度加1&#xff1b; 3、二叉树的根节点只有右子树而没有左子树&#xff0c;那么可…

计算二叉树深度算法(递归、非递归)入门详解

一、引言 二叉树在应用时&#xff0c;经常需要知道二叉树的深度。二叉树的深度就是二叉树的层数&#xff0c;即从树根算起&#xff0c;到最底下一层的层数是多少&#xff0c;即二叉树中结点的最大层次值。 本文给出了计算二叉树深度的算法&#xff0c;包括递归算法和非递归算法…

计算二叉树的深度

[算法步骤] 如果是空树&#xff0c;递归结束&#xff0c;深度为0&#xff1b;否则执行一下操作 递归计算左子树的深度计为m;递归计算右子树的深度计为n;如果m大于n&#xff0c;二叉树的深度为m1&#xff0c;否则为n1&#xff1b; [算法描述] int Depth(BiTree T) {int m, n…

CreateDialog

使用对话框模版资源创建一个非模态对话框。 CreateDialog调用 CreateDialogParam 函数。 调用语序&#xff1a; HWND CreateDialog(HINSTANCE hInstance,LPCTSTR lpTemplate,HWND hWndParent,DLGPROC lpDialogFunc); 参数 hInstance类型&#xff1a;HINSTANCE 对话框模版…

android 使用showDialog调用相应的对话框

在Activity下调用此函数 showDialog(10); 然后重写以下函数 protected Dialog onCreateDialog(int id) {// TODO Auto-generated method stubswitch(id){case 10:return new AlertDialog.Builder(Activity13.this).setTitle(getString(R.string.title)).setMessage(getString(…

Show()跟ShowDialog()的区别

Show和ShowDialog有什么不同呢&#xff0c;什么时候用Show&#xff0c;什么时候用ShowDialog呢&#xff1f;相信看完这篇博客&#xff0c;你会有一个比较明确的答案。 说到show跟ShowDialog的区别很多人会想到的是&#xff0c;他们一个是非模态一个是模态&#xff0c;模态窗体就…

WPF Tips: Window.ShowDialog()方法:Cannot set Visibility or call Show, ShowDialog, or WindowInteropHelp

关于Window.ShowDialog()方法&#xff0c;有一个常见的容易犯的错误。下面给出这个错误的例子&#xff1a; DemoA&#xff1a;错误的例子 1. 在WPF项目中&#xff0c;创建一个Windows&#xff1a;DialogWindow DialogWindow.xaml <Window x:Class"DemoA.DialogWindow&…

showdialog

在C#中窗口的显示有两种方式&#xff1a;模态显示&#xff08;showdialog&#xff09;和非模态显示&#xff08;show&#xff09;。 区别&#xff1a; 模态与非模态窗体的主要区别是窗体显示的时候是否可以操作其他窗体。模态窗体不允许操作其他窗体&#xff0c;非模态窗体可以…

Flutter dialog (1) - showDialog的讲解

在应用开发中,或多或少都会遇到需要弹框的问题, 比如:需要用户确认,需要输入一些信息等等的问题,这就要用到 dialog 相关的概念了 而在 flutter 中,所有可以看见的都是 Widget,dialog 也不例外 不过和 android 或 iOS 中不同的一点是,Flutter 中 dialog 不是一个单独的类,而是…

C# 按Button弹出新的窗体 Show()方法 和 ShowDialog()方法

在做串口通信程序时&#xff0c;有个想法&#xff0c;当点击串口设置按钮时&#xff0c;弹出一个新的窗口&#xff0c;可以设置串口相关信息&#xff0c;如何实现这一操作呢&#xff1f; 1 新建一个项目&#xff0c;窗体为form1 2 选择项目名称&#xff0c;单击右键&#xff0…

C# 弹出窗口 show()和showdialog()

目录 一、构建工程和界面介绍二 、添加代码三、验证效果和小结 我们在构建C# Form窗口的时候经常需要到弹出新的窗口&#xff0c;那么接着就会如何弹出窗口的疑问。这里介绍最常见的两种弹窗方法show()和showdialog()。我在VS2019中构建一个简单的工程来讲解让他们之间的区别。…

fwrite函数,fread函数和fgets函数详解以及使用方法

c/c文件处理函数 1. fgets函数 函数原型 char *fgets(char *s, int size, FILE *stream);参数解释&#xff1a; s 代表要保存到的内存空间的首地址&#xff0c;可以是字符数组名&#xff0c;也可以是指向字符数组的字符指针变量名。size 代表的是读取字符串的长度。stream …

c语言 fread读指定字节,fread函数 c语言中fread函数怎么用

fread是一个函数,它从文件流中读数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回0。返回真实读取的项数,若大于count则意味着产生了错误。另外,产生错误后,文件位置指示器是无法确定的。若…

c语言fread函数,C语言“fread”函数的用法?

C语言“fread”函数的用法? C语言“fread”函数的用法为“size_tf read(void *buffer,size_t size,size_t count,FILE *stream)”,其作用是从一个文件流中读数据,读取count个元素,每个元素size字节。 示例1#include #include #include int main() {FILE *stream; char m…

【C 语言】文件操作 ( fread 函数 )

文章目录 一、fread 函数二、缓冲区受限的情况 ( 循环读取文件 | feof 函数判定文件读取完毕 )三、处理乱码问题四、记录读取的字节个数五、读取到 0 字节的情况六、读取完毕的情况七、读取文本文件 " " 与 读取二进制文件 " " 区别 二进制文件读写两个重…

Scala对象 转Json字符串

2019独角兽企业重金招聘Python工程师标准>>> import org.json4s.{Formats, NoTypeHints} import org.json4s.jackson.Serialization import org.json4s.jackson.Serialization.writeobject Json4sDemo {// 需要添加隐式转换implicit val formats: AnyRef with Forma…

【系统学习SpringBoot】SpringBoot 对象转JSON输出

SpringBoot输出JSON 以往使用SpringMVC中开发时&#xff0c;对象转JSON需要配置很多东西 【1】添加FastJson/jackjson等第三方jar 【2】在配置文件中配置Controller扫描 【3】给方法添加ResponseBody 配置FastJson还需要给配置文件中添加(很麻烦( ▼-▼ )) <mvc:annot…

【Java 笔记】使用Fastjson2时,对象转json首字母大小写问题

开发环境&#xff1a; Spring cloud Fastjson2 一、JSON 转 Object 推送第三方数据时&#xff0c;对方http接口消息体为json&#xff0c;但是字段首字母大写 我们需要接收JSON 转 Object [ { "ItemCode": "WIND_SPEED", "ItemValue": "2.1…

js 数组、对象转json 以及json转 数组、对象

1、JS对象转JSON 方式&#xff1a;JSON.stringify(obj) var json {"name":"iphone","price":666}; //创建对象&#xff1b; var jsonStr JSON.stringify(json); //转为JSON字符串 console.log(jsonStr);2、JS数组转JSON //数组转json…

对象转JSON首字母大写

最近在做一个第三方接口&#xff0c;接口给的数据类型如下 请求报文如下 {"A0144":"12141256","AB6AM":"中国银行支行","STATUS":1} 一般按照对象转JSON会使首字母小写&#xff0c;与接口文档不相符&#xff0c;因此需要…