二叉树的深度

本文介绍了一种通过递归算法来计算二叉树深度的方法。给出了一棵二叉树的结点定义,并提供了详细的示例及参考代码。适用于理解二叉树结构及其基本操作。

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

 

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

例如:输入二叉树:

                                            10
                                          /     \
                                        6        14
                                      /         /   \
                                    4         12     16

输出该树的深度3。

二叉树的结点定义如下:

struct SBinaryTreeNode // a node of the binary tree
{
      int               m_nValue; // value of node
      SBinaryTreeNode  *m_pLeft;  // left child of node
      SBinaryTreeNode  *m_pRight; // right child of node
};

如果一棵树只有一个结点,它的深度为1。如果根结点只有左子树而没有右子树,那么树的深度应该是其左子树的深度加1;同样如果根结点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加1。如果既有右子树又有左子树呢?那该树的深度就是其左、右子树深度的较大值再加1

上面的这个思路用递归的方法很容易实现,只需要对遍历的代码稍作修改即可。参考代码如下:

///////////////////////////////////////////////////////////////////////
// Get depth of a binary tree
// Input: pTreeNode - the head of a binary tree
// Output: the depth of a binary tree
///////////////////////////////////////////////////////////////////////
int TreeDepth(SBinaryTreeNode *pTreeNode)
{
      // the depth of a empty tree is 0
      if(!pTreeNode)
            return 0;

      // the depth of left sub-tree
      int nLeft = TreeDepth(pTreeNode->m_pLeft);
      // the depth of right sub-tree
      int nRight = TreeDepth(pTreeNode->m_pRight);

      // depth is the binary tree
      return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
}

 

来源:http://zhedahht.blog.163.com/blog/static/25411174200732975328975/

转载于:https://www.cnblogs.com/heyonggang/p/3417760.html

### 计算二叉树深度 #### 方法一:递归法 递归法是最常见的用于计算二叉树深度的方法之一。其核心思想是分别递归地计算左子树和右子树的深度,然后取两者的较大值并加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、付费专栏及课程。

余额充值