若用二叉链表作为二叉树的存储表示,以二叉树根为参数,试编写针对以下问题递归算法: (1) 统计二叉树中非叶子结点的个数。 (2) 交换每个结点的左孩子和右孩子。
时间: 2024-11-25 19:15:35 浏览: 4
设一棵二叉树以二叉链表表示,试编写有关二叉树的递归算法
5星 · 资源好评率100%
若采用二叉链表作为二叉树的存储表示,以下是针对这两个问题的递归算法实现:
(1) 统计二叉树中非叶子结点的个数:
```python
def count_non_leaf_nodes(root):
if root is None: # 如果根节点为空,返回0
return 0
else:
# 对左子树和右子树递归计算非叶子节点数,然后加上当前节点(如果不是叶子节点)
left_count = count_non_leaf_nodes(root.left)
right_count = count_non_leaf_nodes(root.right)
# 如果当前节点不是叶子节点(有左右孩子)
if root.left and root.right:
return left_count + right_count + 1
# 如果是叶子节点之一
elif not root.left and root.right or root.left and not root.right:
return left_count + right_count # 返回左右子树的非叶子节点数
else: # 没有孩子的情况,是叶子节点
return left_count + right_count # 不计入总数
```
(2) 交换每个结点的左孩子和右孩子:
```python
def swap_left_right(root):
if root is None: # 如果根节点为空,无需交换
return None
else:
# 交换当前节点的孩子
root.left, root.right = root.right, root.left
# 对左子树和右子树递归进行同样的交换操作
root.left = swap_left_right(root.left)
root.right = swap_left_right(root.right)
return root
```
对于以上两个函数,记得每次递归结束时返回当前节点,以便于处理整个树。
阅读全文