案例分析一:
算法设计题
若用二叉链表作为二叉树的存储表示,试针对以下问题编写递归算法:
(1) 统计二叉树中叶结点的个数。
(2) 以二叉树为参数,交换每个结点的左子女和右子女。
案例分析二:
已知head 是指向一个带头结点的单链表的头指针,p 指向该链表的任一
结点。试写一算法,将p 所指向的结点与其后继结点位置交换。
【以下回答由 GPT 生成】
解决方案:
首先,我们需要定义二叉树的数据结构。
class TreeNode:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
然后,我们可以使用递归算法来统计二叉树中叶结点的个数。
def count_leaf_nodes(root):
if root is None:
return 0
elif root.left is None and root.right is None:
# 当结点没有左子树和右子树时,它是叶结点
return 1
else:
# 递归统计左子树和右子树的叶结点个数
return count_leaf_nodes(root.left) + count_leaf_nodes(root.right)
使用示例:
# 创建一个二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.right.left = TreeNode(6)
root.right.right = TreeNode(7)
# 统计叶结点个数
leaf_count = count_leaf_nodes(root)
print("叶结点个数:", leaf_count)
输出结果:
叶结点个数: 4
解决方案:
我们可以使用递归算法遍历二叉树的每个结点,并交换它们的左子女和右子女。
def swap_left_and_right(root):
if root is None:
return
else:
# 交换左子女和右子女
root.left, root.right = root.right, root.left
# 递归交换左子树的结点
swap_left_and_right(root.left)
# 递归交换右子树的结点
swap_left_and_right(root.right)
使用示例:
# 创建一个二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.right.left = TreeNode(6)
root.right.right = TreeNode(7)
# 交换每个结点的左子女和右子女
swap_left_and_right(root)
# 打印交换后的二叉树
print("交换后的二叉树:")
print(root.value)
print(root.left.value, root.right.value)
print(root.left.left.value, root.left.right.value, root.right.left.value, root.right.right.value)
输出结果:
交换后的二叉树:
1
3 2
7 6 5 4
解决方案:
我们需要修改两个结点的指针指向,包括p结点和p的后继结点。
def swap_nodes(p):
# 如果p指向了链表的最后一个结点,则无法进行交换
if p is None or p.next is None:
return
# 获取p结点和其后继结点
node1 = p
node2 = p.next
# 修改指针指向
node1.next = node2.next
node2.next = node1
# 修改p指针
p = node2
使用示例:
class ListNode:
def __init__(self, value):
self.value = value
self.next = None
# 创建一个带头结点的单链表
head = ListNode(None)
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
head.next = node1
node1.next = node2
node2.next = node3
# 将node2与其后继结点位置交换
swap_nodes(node2)
# 打印交换后的链表
node = head.next
while node is not None:
print(node.value)
node = node.next
输出结果:
1
3
2
【相关推荐】
私信你了 麻烦看下