二叉树的深度

这篇博客介绍了如何计算二叉树的深度,提供了两种不同的方法:递归和非递归。非递归方法基于层次遍历,利用队列记录节点数量,当一层遍历结束后更新树的高度。递归方法则通过比较左右子树的深度来确定树的最大深度。这两种方法都能有效地解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

示例1

输入:
{1,2,3,4,5,#,6,#,#,7}
返回值:4

题目链接:

二叉树的深度

解析:

这里使用的非递归方法,他是在层次遍历的基础上进行改进而来的,每当一层遍历结束,树的高度+1,

  • 那我们如何判断每一层遍历结束呢?
    • 可以先记录一层的节点数量,在这一层每遍历到一个节点,就减少当前层元素数量,直到为0
  • 那怎么记录到下一层的节点个数呢?
    • 注意到每一层的最后一个节点被遍历(并出队列)后,当前队列中只会留下下一层全部的节点。那么下一层元素数量就可以被记录下来了!
import java.util.*;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public int TreeDepth(TreeNode root) {
       	if (root == null) return 0;	
		// 树的高度
		int height = 0;
		// 存储着每一层的元素数量
		int levelSize = 1;
		Queue<TreeNode> queue = new LinkedList<>();
		queue.offer(root);
		
		while (!queue.isEmpty()) {
           
			TreeNode node = queue.poll();
			levelSize--; //每当一层最后一个节点出队列,意味着此时队列中只有下一层的节点了
			
			if (node.left != null) {
				queue.offer(node.left);
			}
			
			if (node.right != null) {
				queue.offer(node.right);
			}
            
			if (levelSize == 0) { // 意味着即将要访问下一层
				levelSize = queue.size();
				height++;
			}
		}
		return height;
		}
    }

递归

public int TreeDepth(TreeNode root) {
 if(root==null){
     return 0;
 }
 int left=TreeDepth(root.left);
 int right=TreeDepth(root.right);
 return Math.max(left,right)+1;
}
### 计算二叉树深度 #### 方法一:递归法 递归法是最常见的用于计算二叉树深度的方法之一。其核心思想是分别递归地计算左子树和右子树的深度,然后取两者的较大值并加1作为整棵树的深度。 以下是基于 Python 的递归实现: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def maxDepth(root: TreeNode) -> int: if root is None: return 0 else: left_depth = maxDepth(root.left) # 左子树的深度 right_depth = maxDepth(root.right) # 右子树的深度 return max(left_depth, right_depth) + 1 # 整体深度为左右子树中的最大值再加1 ``` 这种方法的时间复杂度为 O(n),其中 n 是节点的数量,因为每个节点都会被访问一次[^1]。然而需要注意的是,如果二叉树非常不平衡,则可能导致栈溢出的风险,尤其是在极端情况下(如退化成链表的情况)。此外,由于递归会重复调用函数本身,因此效率可能不如迭代方法高[^2]。 #### 方法二:非递归法(层序遍历) 另一种方式是非递归的方式——即采用广度优先搜索(BFS),也叫层次遍历。这种方式不需要显式的递归操作,而是借助队列来逐层处理节点。 下面是使用 BFS 实现的 Python 版本代码: ```python from collections import deque def maxDepth(root: TreeNode) -> int: if not root: return 0 queue = deque([(root, 1)]) # 初始化队列为根节点及其对应的层数 while queue: node, level = queue.popleft() if node.left: queue.append((node.left, level + 1)) if node.right: queue.append((node.right, level + 1)) return level # 返回最后处理的那一层的高度 ``` 此版本通过维护一个队列记录每一层上的所有节点,并逐步扩展到下一层直到没有更多节点为止。相比起递归形式来说,该方法可以有效避免因过深嵌套而引发的堆栈错误问题[^5]。 #### 性能对比分析 尽管两种算法都可以正确得出结果,但在实际应用中它们各有优劣之处。对于平衡较好的二叉树而言,上述任一种方案都能高效完成任务;但对于极度倾斜甚至接近单向列表形态的数据集时,推荐选用迭代型解决方案以规避潜在风险[^4]。 ### 结论 综上所述,无论是采取哪种策略解决此类题目都需要清楚理解各自适用场景以及局限所在以便做出最佳选择依据具体需求情况决定最适合自己的工具箱选项即可满足日常开发工作当中遇到的相关挑战[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值