算法-二叉树-简单-二叉树的最大和最小深度

文章介绍了如何使用深度优先搜索(DFS)和广度优先搜索(BFS)算法解决二叉树的最大深度和最小深度问题,通过递归和队列数据结构实现,分别展示了代码实例和处理特殊情况的方法。

记录一下算法题的学习7

二叉树的最大深度

题目:给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

输入:root = [3,9,20,null,null,15,7]
输出:3

示例分析:

这里根节点为3,叶子节点是什么呢?---->是指没有子节点的节点,记录从根节点到最远叶子节点的最长路径上的节点数,那么就是3-20-15,或者3-20-7,一共是3个节点数

怎么体现呢?

深度优先搜索代码展示:

class Solution {
    public int maxDepth(TreeNode root) {
      //首先输入根节点为空的情况下,二叉树就不存在  
      if(root==null){
          return 0;
      }
      //判断输入根节点不为空,存在二叉树
      else{
          int leftDepth=maxDepth(root.left); //得到根节点root左子树的最长路径上的节点数
          int rightDepth=maxDepth(root.right);//得到根节点root右子树的最长路径上的节点数
          return Math.max(leftDepth,rightDepth)+1;//由题目可知,还需加上代表根节点的节点数1
      }
    }
}

广度优先搜索代码展示:

这里进行回忆记录Queue?

  • Queue是java中实现队列的接口,它总共有6个方法,我们一般只用其中3个就可以了。
  • Queue的实现类有LinkedList和PriorityQueue。最常用的实现类是LinkedList。

方法

作用区别

add()

压入元素(添加)相同:未超出容量,从队尾压入元素,返回压入的那个元素。
区别:在超出容量时,add()方法会对抛出异常,offer()返回false
offer()压入元素(添加)
remove()弹出元素(删除)相同:容量大于0的时候,删除并返回队头被删除的那个元素。
区别:在容量为0的时候,remove()会抛出异常,poll()返回false
poll()弹出元素(删除)
element()获取对头元素相同:容量大于0的时候,都返回队头元素。但是不删除。
区别:容量为0的时候,element()会抛出异常,peek()返回null。
peek()获取对头元素
class Solution {
    public int maxDepth(TreeNode root) {
      //首先输入根节点为空的情况下,二叉树就不存在  
      if(root==null){
          return 0;
      }
      Queue<TreeNode> queue=new LinkedList<>();//初始化队列queue
      queue.offer(root);//将根节点加入队列中
      int result=0;//初始化结果
      while(!queue.isEmpty()){ //队列不为空的情况,即刚才加入的根节点!=null
          int size=queue.size();//取出当前队列的长度
          while(size-->0){//取出相同数量的节点数进行遍历
              TreeNode node=queue.poll();
              if(node.left!=null){
                  queue.offer(node.left);
              }
              if(node.right!=null){
                  queue.offer(node.right);
              }
          }
          result++; 
      }
      return result;
    }
}

二叉树的最小深度

题目:给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

输入:root = [3,9,20,null,null,15,7]
输出:2
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

示例分析:

如果我们直接将二叉树的最大深度的代码,直接拿来用,就会报错,因为我们忽略了还有一种情况(左孩子和右孩子有一个为空的情况,但不确定是哪一个,我们返回leftDepth+rightDepth+1)在求二叉树的最小深度中。

 深度优先搜索代码展示:

class Solution {
    public int minDepth(TreeNode root) {
      //首先输入根节点为空的情况下,二叉树就不存在  
      if(root==null){
          return 0;
      }
      //1.左孩子和右孩子都为空的情况,说明到达了叶子节点,直接返回1
      if(root.left == null && root.right == null){
          return 1;
      }
      int leftDepth=minDepth(root.left); //得到根节点root左子树的最短路径上的节点数
      int rightDepth=minDepth(root.right);//得到根节点root右子树的最短路径上的节点数
      //2.左孩子和右孩子有一个为空的情况,但不确定是哪一个,我们返回leftLength+rightLength+1
      if(root.left == null || root.right == null){
          return leftDepth+rightDepth+1;
      //3 左孩子和右孩子都不为空的情况,那就比较出两者之间更小的值,然后再加一,得到最小深度
      }else{
          return Math.min(leftDepth,rightDepth)+1;//由题目可知,还需加上代表根节点的节点数1
      } 
    }
}

广度优先搜素代码展示:

class Solution {
    public int minDepth(TreeNode root) {
      //首先输入根节点为空的情况下,二叉树就不存在  
      if(root==null){
          return 0;
      }
      Queue<TreeNode> queue = new LinkedList<>();
      queue.offer(root);
      int result=1;
        while (!queue.isEmpty()) {
            int size=queue.size();
            for(int i=0;i<size;i++){
            TreeNode node =queue.poll();
            if (node.left == null && node.right == null) {
                return result;
            }
            if (node.left != null) {
                queue.offer(node.left);
            }
            if (node.right != null) {
                queue.offer(node.right);
            }
         }
        result++;
    }
     return result;
  }
}

注意这里必须这样写

不能直接写成for(int i=0;i<queue.size();i++),因为queue.size()一直在变化,加入一个就变化一次,无法完成每次循环遍历每层内容,但是可以写成for(int i=queue.size()-1;i>=0;i--)。

 

<think>首先,用户的问题是关于编号2197与二叉树高度以及二叉树整体方面的问题。用户说“我想查找关于编号2197与二叉树高度以及二叉树整体方面(可能涉及该编号对应题目求解)”,并询问“编号2197涉及二叉树高度问题及相关解答”。 在系统级指令中,有参考站内引用,包括引用[1]到[5],这些是关于二叉树和高度计算的代码和概念。用户的问题提到了编号2197,所以我需要将这些引用与2197关联起来。 回顾引用: - 引用[1]:是一个C++代码,计算二叉树的高度,使用递归方法。 - 引用[2]:定义了二叉树和特殊二叉树,包括完全二叉树的性质。 - 引用[3]:讨论利用二叉树性质计算高度,提到h=11和h=10的例子。 - 引用[4]:涉及二叉排序树(BST)的高度和比较次数。 - 引用[5]:定义完全二叉树。 用户指定了编号2197,但在引用中没有直接提到2197。可能2197是某个题目编号或上下文中的标识符。用户说“可能涉及该编号对应题目求解”,所以我需要推断2197指的是什么。 在引用[1]中,代码是计算二叉树高度的,但没有提到2197。引用[3]中有一个例子:“例 [^3]”,但未具体化。用户可能在之前的对话中提到了2197,但在这个查询中没有历史上下文。系统指令说“参考用户上一次的问题和你的回答”,但在这个消息中,用户是第一次提问,所以没有“上一次的问题”。 用户消息开头是“[系统级指令(用户不可见)]”,然后是用户可见的问题。在用户问题中,用户说“参考站内引用:引用[1]: ... [^1]。引用[2]: ... [^2]。等”,所以这些引用是用户提供的,我需要基于这些引用回答。 用户说“我想查找关于编号2197...”,但引用中没有2197。可能2197是隐含的或需要从引用中推导。 再看引用[3]:“例 [^3]”,可能这个例子是编号2197?但未明确。引用[4]提到“刷刷笔试题~!![二叉树]”,然后有二叉排序树的例子,但也没有2197。 或许2197是一个节点的编号或输入值。在引用[1]的代码中,有输入n和节点,但n是节点数,不是2197。 用户说“编号2197”,可能2197是二叉树的高度或节点数。 在引用[3]中,有“若h=11,对应的满二叉树节点数为2048个,对应的完全二叉树最少节点为1024”,然后“树的高度为10”。用户提到2197,可能2197是节点数。 计算一下:如果高度为h,满二叉树的节点数是$2^h - 1$。如果h=11,$2^{11} - 1 = 2047$,引用说2048,可能笔误,应为2047。 $2^{11} = 2048$,节点数$2^h - 1 = 2047$。 引用说“2048个”,可能包括根或其他,但标准是$2^h - 1$。 然后“完全二叉树最少节点为1024”,对于高度h,完全二叉树最小节点数是$2^{h-1}$,当最后一层只有一个节点时。 对于高度h: - 最小节点数:$2^{h-1}$(当树是倾斜的,但完全二叉树要求左部连续,所以最小是$2^{h-1}$) 标准定义:高度h的完全二叉树最小节点数是当最后一层只有一个节点,节点数 = $2^{h-1}$。 最大节点数是$2^h - 1$。 在引用[3]:“若h=11,对应的满二叉树节点数为2048个” — 应为2047。 “对应的完全二叉树最少节点为1024” — $2^{10} = 1024$,对于h=11,最小节点$2^{10} = 1024$。 然后“说明树的高度一定小于11层,再带入h=10发现范围已经包含531。故树的高度为10。” 这里,531是节点数。用户提到2197,可能2197是类似的节点数,需要求高度。 用户说“编号2197”,可能2197是输入值。 在引用中没有2197,但用户指定了编号2197,所以我应该假设2197是问题中的参数。 或许在之前的上下文,但这里没有。 用户问题:“我想查找关于编号2197与二叉树高度以及二叉树整体方面(可能涉及该编号对应题目求解)” 然后“请问编号2197涉及二叉树高度问题及相关解答” 所以,我需要提供关于二叉树高度的解答,并关联2197。 既然引用[3]有例子用531求高度,我可以类似地处理2197。 首先,回忆二叉树高度的性质。 从引用[2],高度为H的二叉树至多有$2^H - 1$个节点。 对于完全二叉树,高度H的完全二叉树,节点数N满足: $2^{H-1} \leq N \leq 2^H - 1$ 因为最小节点数是$2^{H-1}$(当H-1层满,最后一层1个节点),最大是$2^H - 1$(满二叉树)。 所以,给定N,求H,就是找到H使得$2^{H-1} \leq N \leq 2^H - 1$。 或者,H = floor(log2(N)) + 1 对于N个节点的完全二叉树,高度H = floor(log2(N)) + 1 计算log2(2197) 首先,2^11 = 2048 2^12 = 4096 2048 < 2197 < 4096 所以 log2(2197) 在11和12之间。 具体,2197 / 2048 ≈ 1.073, 所以 log2(2197) ≈ 11 + log2(1.073) ≈ 11 + 0.1 = 11.1(粗略) 更精确,2^11 = 2048 2197 - 2048 = 149 所以 log2(2197) = log2(2048 * 1.073) = 11 + log2(1.073) log2(1.073) ≈ 0.1(因为 2^0.1 ≈ 1.07177,接近) 所以 log2(2197) ≈ 11.1 那么 floor(log2(2197)) + 1 = floor(11.1) + 1 = 11 + 1 = 12 检查范围。 对于高度H,最小节点数 $2^{H-1}$,最大 $2^H - 1$ 如果H=12,最小节点 $2^{11} = 2048$,最大 $2^{12} - 1 = 4095$ 2197 > 2048, 且 2197 <= 4095? 2197 < 4095, yes. 对于H=11,最小节点 $2^{10} = 1024$,最大 $2^{11} - 1 = 2047$ 2197 > 2047? 2197 > 2047, yes, 所以N=2197 > 2047, 因此高度不能是11,因为最大节点2047。 所以对于N=2197,高度至少12。 H=12时,最小节点2048,2197 >= 2048,所以是可能的。 H=11时最大节点2047,2197 > 2047,所以高度必须大于11,因此H=12。 所以对于2197个节点的完全二叉树,高度是12。 在引用[3]中,对于531,H=10,因为2^9=512, 2^10-1=1023, 512 <= 531 <= 1023。 类似地,这里2197。 用户可能期望一个解答。 但用户说“二叉树高度以及二叉树整体方面”,所以可能需要解释概念。 引用[1]中有计算高度的代码。 或许2197是输入到代码中。 但代码输入是节点数和边。 在引用[1]代码中,输入n是节点数,然后边信息。 但用户没有提供树的具体结构,所以可能假设是完全二叉树或类似。 既然用户提到“编号2197”,可能2197是问题编号,但引用中没有指定。 为了回答,我可以提供一个一般的方法。 结构化回答: 1. 解释二叉树高度。 2. 讨论如何计算高度,包括递归方法(引用[1])和利用性质(引用[2][3])。 3. 对于给定节点数2197,计算完全二叉树的高度。 4. 相关代码或步骤。 此外,系统指令要求生成相关问题。 首先,回答部分。 用户可见层:回答结构清晰,逐步解决问题。 所以,计划: - 引入二叉树高度概念。 - 解释如何计算:递归或基于性质。 - 针对2197,计算高度。 - 提供代码示例(基于引用[1])。 - 生成相关问题。 引用末尾添加引用标识,例如。 引用是用户提供的,所以我需要引用它们。 例如,提到递归方法时,引用[1]。 提到性质时,引用[2][3]。 现在,对于2197: 假设2197是二叉树的节点数,我们想求其高度。 如果是任意二叉树,高度可以从log2(N+1)到N,但最坏情况。 但通常在这种上下文中,可能指完全二叉树或平均情况。 在引用[3]中,是针对完全二叉树。 引用[4]是BST,但高度也类似。 为了具体,假设是完全二叉树。 计算:N=2197 H = floor(log2(N)) + 1 log2(2197): 2^11 = 2048 2^12 = 4096 2197 / 2048 ≈ 1.07324 log2(1.07324) = ln(1.07324)/ln(2) ≈ 0.0719 / 0.6931 ≈ 0.1037? 计算: ln(1.07324) ≈ 0.0708 (因为 e^0.07 ≈ 1.0725, close) 更准:1.07324, ln(1.07324) ≈ 0.0708 ln(2) ≈ 0.6931 所以 log2(1.07324) ≈ 0.0708 / 0.6931 ≈ 0.1021 所以 log2(2197) = 11 + 0.1021 = 11.1021 floor(11.1021) = 11 然后 H = floor(log2(N)) + 1 = 11 + 1 = 12 使用不等式: 2^{H-1} <= N <= 2^H - 1 对于H=11: 2^{10} = 1024, 2^{11}-1=2047, 2197 > 2047, 所以不满足 H=12: 2^{11} = 2048, 2^{12}-1=4095, 2048 <= 2197 <= 4095, 是的。 所以高度是12。 如果是任意二叉树,高度可能更高,但通常问题指定类型。 在引用中,[3]讨论完全二叉树。 所以,我将这样处理。 现在,回答结构: 1. **二叉树高度概念**:引用定义,高度是树的最大深度,从根到最远叶子的边数。[^2] 2. **计算高度的方法**: - 递归方法:如引用[1]代码所示,通过递归计算左右子树高度取最大加一。 - 利用性质:对于完全二叉树,高度可以用节点数计算,如引用[2][3]所述。 3. **针对节点数2197的计算**: - 假设是完全二叉树,高度H满足 $2^{H-1} \leq 2197 \leq 2^H - 1$。 - 计算:对于H=11,最大节点2047 < 2197,不满足。 H=12,最小节点2048 <= 2197 <= 4095,满足。 - 因此,高度为12。[^3] 4. **代码示例**:提供类似引用[1]的代码,用于计算给定二叉树的高度。 然后,生成相关问题。 系统指令要求使用中文,行内数学用$...$,独立公式用$$...$$。 例如,不等式:$2^{H-1} \leq N \leq 2^H - 1$ 在回答中引用段落末尾添加引用标识。 例如:二叉树的高度可以通过递归方法高效计算。 相关问题: 1. 如何计算非完全二叉树的高度? 2. 二叉树高度和深度有什么区别? 3. 对于n个节点的二叉树最小和最大高度是多少? 用户提到“二叉树整体方面”,所以可能包括性质等。 引用[2]有性质,可以提及。 最终回答。 </think> ### 编号2197与二叉树高度问题解答 用户查询涉及编号2197与二叉树高度及相关问题。基于您提供的引用内容(引用[1]到[5]),编号2197可能指代一个二叉树的节点数(即二叉树包含2197个节点),需要求解其高度或相关属性。二叉树高度定义为从根节点到最远叶子节点的最长路径上的边数(或节点数,根据定义不同;此处以边数为准)。以下我将逐步解答,结合二叉树基本概念、高度计算方法(包括递归和基于性质的解法),并针对2197进行具体分析。回答保证真实可靠,参考了您提供的引用内容。 --- ### 1. **二叉树高度基本概念** 二叉树是一种树形结构,每个节点最多有两个子节点(左子树和右子树)。高度(height)是衡量树“深度”的重要指标: - 空树高度定义为-1或0(根据实现,常见为-1)。 - 非空树高度 = max(左子树高度, 右子树高度) + 1。 - 对于完全二叉树(一种特殊二叉树),高度与节点数有直接数学关系,能通过公式快速计算[^2][^5]。 特殊二叉树(如完全二叉树)的定义: - **完全二叉树**:除最后一层外,所有层节点数达到最大,且最后一层节点从左向右连续排列。高度为$H$的完全二叉树,节点数$N$满足不等式: $$ 2^{H-1} \leq N \leq 2^H - 1 $$ 高度可计算为$H = \lfloor \log_2 N \rfloor + 1$[^2]。 - **满二叉树**:所有层节点数达到最大,节点数$N = 2^H - 1$[^2]。 引用[2]强调二叉树性质:非空二叉树上叶子结点数等于度为2的结点数加1;高度为$H$的二叉树至多有$2^H - 1$个节点。 --- ### 2. **二叉树高度计算方法** 二叉树高度可通过两种主要方式求解: - **递归方法**:通用且适用于任意二叉树结构。从根节点递归计算左右子树高度,取最大值加1。引用[1]提供了C++代码示例: ```cpp #include <bits/stdc++.h> using namespace std; struct node { char data; int left, right; } BTree[105]; int getDepth(int root) { if (root == 0) return 0; // 空子树高度为0(假设空节点用0表示) int l = getDepth(BTree[root].left); int r = getDepth(BTree[root].right); return max(l, r) + 1; // 返回左右子树最大高度加1 } int main() { int n, a, b; cin >> n; for (int i = 1; i <= n; i++) { cin >> a >> b; // 构建树结构(代码简化,实际需根据输入处理) if (BTree[a].left == 0) BTree[a].left = b; else BTree[a].right = b; } cout << getDepth(1); // 输出以节点1为根的高度 return 0; } ``` 此代码通过递归遍历树计算高度,时间复杂度$O(N)$,空间复杂度$O(H)$(递归栈深度)。如果2197是输入节点数,此代码可处理,但需要具体树结构输入。 - **基于性质的方法**:适用于完全二叉树或满二叉树,无需遍历树。利用节点数$N$直接求高度: - 高度$H$满足$2^{H-1} \leq N \leq 2^H - 1$。 - 解不等式或计算$H = \lfloor \log_2 N \rfloor + 1$。 例如,引用[3]中针对节点数531,计算得高度为10:因$2^{9} = 512 \leq 531 \leq 1023 = 2^{10} - 1$。 --- ### 3. **针对编号2197的高度计算** 假设编号2197表示二叉树的节点数($N = 2197$),我们求解其高度。二叉树类型影响结果: - **如果是一般二叉树**:高度范围大,最小高度$\lfloor \log_2 2197 \rfloor + 1$(平衡时),最大高度2197(退化链表时)。但需具体树结构才能确定。 - **如果是完全二叉树**(常见于问题求解,如引用[3]):可直接用性质计算。步骤如下: 1. 计算高度$H$需满足$2^{H-1} \leq 2197 \leq 2^H - 1$。 2. 测试$H$值: - $H = 11$:最大节点数$2^{11} - 1 = 2047$,但$2197 > 2047$,不满足。 - $H = 12$:最小节点数$2^{11} = 2048$,最大节点数$2^{12} - 1 = 4095$,且$2048 \leq 2197 \leq 4095$,满足。 3. 因此,高度$H = 12$。 公式计算:$\lfloor \log_2 2197 \rfloor + 1$,其中$\log_2 2197 \approx 11.102$(因$2^{11} = 2048$, $2^{12} = 4096$),取整$\lfloor 11.102 \rfloor = 11$,$H = 11 + 1 = 12$[^2]。 **结论**:对于节点数2197的完全二叉树,高度为12。如果2197是其他含义(如题目编号),请提供更多上下文。 --- ### 4. **二叉排序树(BST)高度补充** 如果2197涉及二叉排序树(如引用[4]),BST高度影响搜索效率: - BST高度$H$决定最大比较次数(搜索时路径长度)。 - 例如,引用[4]中BST高度为3,搜索需最多3次比较。 - 对于$N=2197$,理想平衡BST高度约$\lceil \log_2(2197+1) \rceil = 12$,但实际高度取决于插入顺序[^4]。 --- ### 5. **代码实现建议** 若2197是节点数,且树结构已知,可修改引用[1]代码计算高度。输入格式需节点数和边信息。例如,输入$n=2197$后,构建树并调用`getDepth`函数[^1]。 --- ### 相关问题 基于二叉树高度和整体方面,以下是相关问题: 1. 如何计算非完全二叉树的高度?不同二叉树类型(如斜树或满二叉树)对高度有什么影响?[^5] 2. 二叉树高度与深度有什么区别?在实际应用(如数据库索引)中,高度如何影响算法效率?[^4] 3. 对于n个节点的二叉树最小和最大高度分别是多少?如何证明非空二叉树叶子结点数等于度为2的结点数加1?[^3] : 引用[1]: 树的高度计算代码,递归方法实现。 [^2]: 引用[2]: 二叉树定义、性质及特殊二叉树(完全二叉树、满二叉树)。 [^3]: 引用[3]: 利用二叉树性质计算高度,示例分析。 [^4]: 引用[4]: 二叉排序树高度及比较次数。 : 引用[5]: 完全二叉树的基本概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值