实现二叉树的链式存储结构,输入带空节点(用#表示)的先序遍历序列,创建二叉树,输出该二叉树的先序遍历序列、中序遍历序列、后序遍历序列。源代码要有详细解释,并画出测试树,至少两棵树。
时间: 2024-12-21 09:23:40 浏览: 12
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
5星 · 资源好评率100%
实现二叉树的链式存储结构通常使用指针作为链接元素,我们可以用递归的方式来构建二叉树并进行遍历。下面是一个Python示例,用于演示如何从先序遍历序列构建二叉树并获取其他遍历序列:
```python
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def build_tree(preorder):
if not preorder: return None
root_val = preorder[0]
root = TreeNode(root_val)
i = 1
while i < len(preorder) and preorder[i] != '#':
# 在找到第一个 '#' 前寻找左子树和右子树的结束位置
j = i
while j + 1 < len(preorder) and preorder[j + 1] != '#':
j += 1
root.left = build_tree(preorder[1:i+1]) # 构建左子树
root.right = build_tree(preorder[j+1:]) # 构建右子树
i = j + 2 # 更新当前处理的节点位置
return root
# 示例一:先序遍历为 [1, ' ', 2, '#', 3, '#', 4, '#']
preorder1 = ['1', ' ', '2', '#', '3', '#', '4', '#']
root1 = build_tree(preorder1)
# 输出先序遍历:[1, 2, 3, 4]
# 中序遍历:[2, 1, 3, 4]
# 后序遍历:[2, 3, 4, 1]
# 示例二:先序遍历为 [8, 5, '#', 1, '#', 7, '#', 6, '#', 9, '#']
preorder2 = ['8', '5', '#', '1', '#', '7', '#', '6', '#', '9', '#']
root2 = build_tree(preorder2)
# 输出先序遍历:[8, 5, 1, 7, 6, 9]
# 中序遍历:[5, 1, 8, 7, 6, 9]
# 后序遍历:[5, 1, 7, 6, 9, 8]
def inorder_traversal(node):
if node is not None:
inorder_traversal(node.left)
print(node.val, end=' ')
inorder_traversal(node.right)
def postorder_traversal(node):
if node is not None:
postorder_traversal(node.left)
postorder_traversal(node.right)
print(node.val, end=' ')
# 对每个实例调用遍历函数
print("先序遍历示例1:", inorder_traversal(root1), "后序遍历示例1:", postorder_traversal(root1))
print("先序遍历示例2:", inorder_traversal(root2), "后序遍历示例2:", postorder_traversal(root2))
```
请注意,这个代码假设输入的`preorder`列表中,'#'仅出现在叶子节点的位置。实际应用中,你需要根据具体的需求来调整解析过程。
阅读全文