二叉树的深度

博客围绕输入一棵二叉树求其深度展开。指出从根到叶结点的最长路径长度为树的深度,解题思路与求二叉树中和为某一值的路径类似,借助栈保存访问数据,到达叶子节点时计算栈中数据个数并与最大值比较,遍历完所有节点可得深度。

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

题目描述:

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

思路:

此题大体思路和前面博客二叉树中和为某一值的路径基本一致,借助于栈,把访问到的数据保存在栈中,当到达某一叶子节点时,计算栈中的数据个数,并与最大值比较,求得最大值,当二叉树所有节点访问结束便能求得二叉树的深度。


struct TreeNode
{
      int value;
      TreeNode *left;
      TreeNode *right;          
}

class solution
{
	public:
		int GetDepth(TreeNode* root)
		{
			int depth=0;
			int MaxNum=0
			int num=0;
			vector<TreeNode*> tempNode; 
			if(root)
			{
				search(TreeNode* root);
				depth=MaxNum;
			}		
			//return 0;
			return depth;
		}
				
		void search(TreeNode* root)
		{
			tempNode.push_back(root);
                        /*到这里访问到叶子节点,求出栈中数据个数*/
			if(!root->left&&!root->right)
			{
				//MaxNum=;
				if((tempNode.end-tempNode.begin)>MaxNum)
					MaxNum=tempNode.end-tempNode.begin;
				else 
					MaxNum=MaxNum;
			}
			else 
			{
				//num++;
				if(root->left)
				{
					search(root->left);
				}
				if(root->right)
				{
					search(root->right);
				}
			}
			/*如果没有数据,丢弃栈顶数据*/			
			tempNode.pop_back();
		}
		
		
}

简约版: 

class solution
{
	public:
		int GetDepth(TreeNode* root)
		{
			int depth=0;
			int MaxNum=0
			int num=0;	
			if(root)
				depth=depthOfTree(root);
			return depth;
		}
	
		int depthOfTree(TreeNode* tree)
		{
			if(tree==NULL)
				return 0;
			int leftNum=depthOfTree(tree->left);
			int rightNum=depthOfTree(tree->right);
			return (leftNum>rightNum)?leftNum+1:rightNum+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、付费专栏及课程。

余额充值