算法设计题:二叉树采用二叉链表存储结构,请分别用递归和非递归方法编写算法求二叉树的叶子结点的个数。
时间: 2024-10-23 08:17:08 浏览: 20
头歌数据结构二叉树的二叉链表存储及基本操作
5星 · 资源好评率100%
在二叉树的二叉链表存储结构中,我们通常需要遍历整个树来找到所有的叶子节点。这里我会提供两种方法:
1. **递归方法**:
使用递归,我们可以从根节点开始,如果当前节点是叶子节点(即无左孩子且无右孩子),则计数加一;然后对左右子节点递归地应用同样的逻辑。
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def countLeavesRecursive(root):
if not root: # 如果节点为空,返回0
return 0
elif not root.left and not root.right: # 如果是叶子节点,计数加一
return 1
else:
return countLeavesRecursive(root.left) + countLeavesRecursive(root.right)
```
2. **非递归方法(迭代)**:
我们可以使用栈来辅助非递归遍历。首先将根节点入栈,然后进入循环。每次弹出一个节点,检查它是否为叶子节点并累加计数,同时将其未访问的子节点压入栈中。
```python
def countLeavesIterative(root):
if not root:
return 0
stack, count = [root], 0
while stack:
node = stack.pop()
if not node.left and not node.right:
count += 1
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return count
```
阅读全文