二叉树采用二叉链表存储结构,请分别用递归和非递归算法求二叉树的叶子节点的个数
时间: 2024-10-14 15:10:13 浏览: 42
erchashubianli.rar_用二叉链表 进行 二叉树 遍历
二叉树的叶子节点是指没有孩子的节点,即左孩子和右孩子都为空的节点。我们可以使用递归和迭代两种方法来计算二叉链表存储结构的二叉树的叶子节点数目。
**递归算法**:
1. 定义基本情况:如果当前节点为空,则返回0,表示没有叶子节点。
2. 非空节点情况下,计算左右子树的叶子节点之和,并加上当前节点自身(若它是叶子节点的话)。
3. 递归调用,对左右子节点分别进行上述操作。
```python
def count_leaves_recursive(node):
if node is None:
return 0
elif node.left is None and node.right is None: # 如果节点是叶子节点
return 1
else:
return count_leaves_recursive(node.left) + count_leaves_recursive(node.right)
```
**非递归算法** (也称为迭代法或层次遍历法):
1. 初始化一个变量 `leaf_count` 用于计数,值设为0。
2. 使用栈辅助遍历二叉树。首先将根节点入栈。
3. 当栈不为空时,循环处理:
a. 弹出栈顶元素。
b. 如果该节点是叶子节点(无左右子节点),则加1到 `leaf_count`。
c. 将节点的左右子节点(如有)压入栈中。
4. 循环结束,返回 `leaf_count`。
以下是Python的非递归版本:
```python
def count_leaves_iterative(root):
leaf_count = 0
stack = [root]
while stack:
node = stack.pop()
if node.left is None and node.right is None: # 叶子节点
leaf_count += 1
if node.right is not None:
stack.append(node.right)
if node.left is not None:
stack.append(node.left)
return leaf_count
```
阅读全文