maximum-depth-of-binary-tree

博客围绕二叉树展开,介绍了求其最大深度的三种思路,包括递归、BFS(用队列)、DFS(用栈),还对比了最小深度和最大深度的求解方法,给出了递归和BFS两种方式下的具体判断与计算逻辑。

Given a binary tree, find its maximum depth.

The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.

思路一:递归

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null)
            return 0;
        else if(root.left==null&&root.right==null)
            return 1;
        else if(root.left==null)
            return maxDepth(root.right)+1;
        else if(root.right==null)
            return maxDepth(root.left)+1;
        return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
    }
}
import java.util.*;
public class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null)
            return 0;
        return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
    }
}

思路二:BFS,效率高,用queue

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.*;
public class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null)
            return 0;
        Queue<TreeNode> queue=new LinkedList<TreeNode>();
        queue.add(root);
        int depth=0;//区别于最小depth的时候
        while(!queue.isEmpty()){
            int size=queue.size();
            for(int i=0;i<size;i++){
                TreeNode node=queue.poll();
                if(node.left!=null)
                    queue.add(node.left);
                if(node.right!=null)
                    queue.add(node.right);
            }
            depth++;
        }
        return depth;
    }
}

思路三:DFS,用栈

import java.util.*;
public class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null)
            return 0;
        Stack<TreeNode> nodestack=new Stack<TreeNode>();//利用栈的后进先出
        Stack<Integer> depthstack=new Stack<>();//对应节点的深度
        nodestack.push(root);
        depthstack.push(1);
        int max=0;
        while(!nodestack.isEmpty()){
            TreeNode node=nodestack.pop();
            int temp=depthstack.pop();
            max=Math.max(temp,max);//每个节点,计算当前节点最大深度
            if(node.left!=null){//有子节点则加入,深度为当前深度加1;
                nodestack.push(node.left);
                depthstack.push(temp+1);
            }
            if(node.right!=null){
                nodestack.push(node.right);
                depthstack.push(temp+1);
            }
        }
        return max;
    }
}

最小深度和最大深度对比
利用递归时:
都可以判断
root null:return 0
else if root.left
null &&root.rightnull :return 1;
else if root.left
null: return max/minDepth(root.right)+1;
else if root.right==null: return max/minDepth(root.left)+1;
最后return Math.max/min(max/minDepth(root.left),max/minDepth(root.right))+1;
利用BFS:
最大深度初始depth=0,每层遍历完depth++,最后返回depth
最小深度初始depth=1,遇到左右节点都为空,则返回depth;否则depth++,最后返回depth

这段代码是用**递归法**实现的**求二叉树的最大深度**,属于非常经典且简洁的递归解法。 --- ## 🧠 函数作用 ```cpp int maxDepth(TreeNode* root) ``` - **功能**:返回以 `root` 为根节点的二叉树的最大深度(即树有多少层)。 - **返回值类型**:`int` - **输入参数**:`TreeNode* root`,表示当前子树的根节点。 --- ## 🧾 代码详解 ```cpp if (root == nullptr) { return 0; } ``` - **递归终止条件**:如果当前节点为空,说明这是一棵空树或递归到了叶子节点的子节点,深度为 0。 ```cpp int l_depth = maxDepth(root->left); int r_depth = maxDepth(root->right); ``` - **递归调用**: - `l_depth`:递归求左子树的最大深度。 - `r_depth`:递归求右子树的最大深度。 ```cpp return max(l_depth, r_depth) + 1; ``` - **返回当前树的深度**: - 当前节点的深度 = 左右子树中较大的深度 + 1(加上当前节点这一层)。 --- ## 🔍 举例说明 假设二叉树结构如下: ``` 3 / 9 \ 15 \ 7 ``` 递归调用过程如下(简化): 1. `maxDepth(3)` - `left` 是 9,`right` 是 null - 进入 `maxDepth(9)` - `left` 是 null,`right` 是 15 - 进入 `maxDepth(15)` - `left` 是 null,`right` 是 7 - 进入 `maxDepth(7)` -> 返回 1 - 返回 `1 + 1 = 2` - 返回 `2 + 1 = 3` - 返回 `3 + 1 = 4` 所以最终返回 `4`,即这棵树的最大深度是 4 层。 --- ## ✅ 算法特点 | 特性 | 说明 | |------|------| | 时间复杂度 | O(n),其中 n 是节点数,每个节点只访问一次 | | 空间复杂度 | O(h),h 是树的高度(递归栈的空间) | | 算法类型 | DFS(深度优先搜索)中的后序遍历思想 | | 是否递归 | ✅ 是 | --- ## ❗ 注意事项 - 该算法适合**递归实现**,但在**树非常深**的情况下可能会导致栈溢出。 - 如果要避免栈溢出,可以用**迭代法**(如层序遍历)实现。 --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值