求二叉树深度的操作就是用递归算法求出左右子树的深度,左右子树深度的最大值+1即为该二叉树的深度(根结点是第一层)。设计一个算法(函数)来计算二叉树的深度。在main程序中测试。若将该递归算法转换成非递归算法,可采用什么方法?为什么?
时间: 2024-02-12 15:07:28 浏览: 80
常用的数据结构的算法,包括二叉树的三种递归和非递归算法,染色问题,八皇后问题,深度广度遍历,约瑟夫环,数值转换,树的高度和叶子节
以下是基于递归算法的二叉树深度计算函数的实现:
```python
def tree_depth(root):
if root is None:
return 0
left_depth = tree_depth(root.left)
right_depth = tree_depth(root.right)
return max(left_depth, right_depth) + 1
```
其中,`root` 表示二叉树的根节点,如果为空则返回 0。递归计算左右子树的深度,然后取最大值并加 1,即为该二叉树的深度。
如果要将递归算法转换成非递归算法,可以使用栈来实现。具体步骤如下:
1. 将根节点入栈,并初始化深度为 1。
2. 循环执行以下操作,直到栈为空:
- 弹出栈顶节点,并将其深度保存。
- 如果该节点有右子树,则将右子树入栈,并将深度加 1。
- 如果该节点有左子树,则将左子树入栈,并将深度加 1。
3. 当栈为空时,返回保存的最大深度。
这种方法称为迭代实现,其优点是避免了递归过程中的函数调用开销,同时可以避免递归深度过大导致的栈溢出问题。
以下是基于非递归算法的二叉树深度计算函数的实现:
```python
def tree_depth(root):
if root is None:
return 0
stack = [(root, 1)]
max_depth = 1
while stack:
node, depth = stack.pop()
if node.left:
stack.append((node.left, depth + 1))
if node.right:
stack.append((node.right, depth + 1))
max_depth = max(max_depth, depth)
return max_depth
```
其中,`stack` 为保存节点和深度的栈,`(root, 1)` 表示将根节点和深度 1 入栈。循环弹出栈顶节点,如果有左子树或右子树,则将其入栈,并将深度加 1。每次更新最大深度,最后返回即可。
阅读全文