算法 - 求二叉树的最大深度

本文介绍了一种通过递归算法来计算二叉树的最大深度的方法。核心思想为:递归遍历所有节点,并返回每个子树的最大深度加一(根节点)。注意:在返回值的表达式中正确使用括号确保逻辑清晰。

CODE

<span style="font-size:14px;">public class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null)
            return 0;
        int lMax = maxDepth(root.left);
        int rMax = maxDepth(root.right);
        return 1+((lMax>rMax)?lMax:rMax);
    }
}</span>

核心思想

1 递归遍历所有节点

2 return 1+((lMax>rMax)?lMax:rMax);

(1) 1是指根结点

(2) 不能写成 return 1+ (lMax>rMax)?lMax:rMax; ,这里+运算符会影响三目运算符的正常使用,要养成勤加 ( ) 的习惯,避免一些

知的危险。


return 1+ (lMax>rMax)?lMax:rMax;

<think>根据用户的问题,用户想要了R6-1问题中二叉树深度的方法。从提供的引用中,我们可以找到多个关于二叉树深度算法,特别是递归算法。 从引用[1]和引用[5]中,我们可以看到递归二叉树深度的典型方法: - 如果二叉树为空,深度为0。 - 否则,递归计算左子树的深度和右子树的深度,然后取其中较大者加1(当前节点深度)。 引用[2]虽然主要讨论平衡二叉树的判断,但也使用了类似的方法计算深度,并在不平衡时返回-1。 因此,针对R6-1问题(根据上下文,可能是某个题目编号),我们可以认为二叉树深度的方法就是使用递归算法,如引用[1]和引用[5]所示。 下面将给出清晰的递归算法描述和代码实现(使用C语言,因为引用[1]和引用[4]都是C/C++风格)。 ### 二叉树深度的递归算法 二叉树深度定义:从根节点到最远叶子节点的最长路径上的节点数。 算法步骤: 1. 如果树为空(即根节点为NULL),则深度为0。 2. 否则,递归计算左子树的深度。 3. 递归计算右子树的深度。 4. 取左子树深度和右子树深度的较大值,然后加1(当前节点贡献一层深度)。 代码实现(C语言): ```c #include <stdio.h> #include <stdlib.h> typedef struct BiTNode { int data; struct BiTNode *Lchild, *Rchild; } BiTNode, *BiTree; int Depth(BiTree T) { if (T == NULL) { return 0; } else { int left_depth = Depth(T->Lchild); // 递归左子树深度 int right_depth = Depth(T->Rchild); // 递归右子树深度 // 返回左右子树深度较大值加1 return (left_depth > right_depth ? left_depth : right_depth) + 1; } } ``` 注意:这里假设二叉树的结构体定义为`BiTNode`,指针为`BiTree`,每个节点包含左右孩子指针。 ### 示例说明 例如,对于以下二叉树(用括号表示法表示): ``` 1 / \ 2 3 / \ 4 5 ``` 深度计算过程: - 节点1:左子树(节点2)深度为1,右子树(节点3)深度为2,所以深度为max(1,2)+1=3。 ### 复杂度分析 - 时间复杂度:$O(n)$,其中$n$是二叉树节点数,因为每个节点都被访问一次。 - 空间复杂度:$O(h)$,其中$h$是二叉树的高度,即递归调用栈的最大深度。 ### 相关问题 1. 如何用非递归方法二叉树深度? 2. 如何判断一棵二叉树是否是平衡二叉树? 3. 如何二叉树的最大宽度? </think> ### R6-1问题中二叉树深度方法 根据您提供的引用内容,R6-1问题中的二叉树深度采用**递归算法**,其核心思想是:二叉树深度等于其左右子树深度的较大值加1。以下是详细析: #### 算法原理 1. **基准情况**:若二叉树为空(`T == NULL`),深度为0。 2. **递归分**: - 计算左子树深度 $l = Depth(T→Lchild)$ - 计算右子树深度 $r = Depth(T→Rchild)$ 3. **合并结果**:深度 $= \max(l, r) + 1$(加1代表当前节点所在的层) #### 代码实现(C语言) ```c int Depth(BiTree T) { if (T == NULL) return 0; // 空树深度为0 else { int l = Depth(T->Lchild); // 递归左子树 int r = Depth(T->Rchild); // 递归右子树 return (l > r ? l : r) + 1; // 取较大值+1 } } ``` #### 关键点说明 1. **递归终止条件**:遇到空节点时返回0,这是递归的基础[^1][^5]。 2. **深度计算逻辑**: - 叶子节点:左右子树深度均为0,返回 $0+1=1$ - 非叶子节点:如左子树深度=2,右子树深度=3,则当前深度 $= \max(2,3)+1=4$ 3. **时间复杂度**:$O(n)$(每个节点访问一次) 4. **空间复杂度**:$O(h)$($h$为树高,递归栈深度) #### 示例演算 假设二叉树结构: ``` A / \ B C / \ D E ``` 深度计算过程: 1. 节点A:$\max(Depth(B), Depth(C)) + 1$ 2. 节点B:$\max(0,0)+1=1$(B是叶子) 3. 节点C:$\max(Depth(D), Depth(E)) + 1 = \max(1,1)+1=2$ 4. 最终结果:$\max(1,2)+1=3$ #### 应用场景 此算法二叉树的基础操作,用于: 1. 判断平衡二叉树(结合深度差验证)[^2] 2. 计算完全二叉树层级[^3] 3. 树形结构统计分析(如最大权值层)[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值