设计一个python算法:假设二叉树用二叉链存储,给出中序序列和后序序列,构造二叉树并给出先序遍历。 思路:构造二叉树:取后序序列尾元素d,创造根结点d,在ins中找到根结点的索引,确定左子树中结点个数k,递归构造左右子树。 先序遍历:递归方法,访问根结点,递归遍历左子树,递归遍历右子树。
时间: 2024-03-27 09:36:47 浏览: 98
以下是基于您提供的思路的Python算法实现:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def buildTree(inorder, postorder):
if not inorder:
return None
root = TreeNode(postorder[-1])
idx = inorder.index(root.val)
left_inorder = inorder[:idx]
right_inorder = inorder[idx+1:]
left_postorder = postorder[:idx]
right_postorder = postorder[idx:-1]
root.left = buildTree(left_inorder, left_postorder)
root.right = buildTree(right_inorder, right_postorder)
return root
def preorderTraversal(root):
if not root:
return []
res = [root.val]
res += preorderTraversal(root.left)
res += preorderTraversal(root.right)
return res
# test
inorder = [9, 3, 15, 20, 7]
postorder = [9, 15, 7, 20, 3]
root = buildTree(inorder, postorder)
print(preorderTraversal(root))
```
在这个算法中,我们首先定义了一个 `TreeNode` 类来表示二叉树结点。然后,我们定义了两个函数 `buildTree` 和 `preorderTraversal`。
`buildTree` 函数用于构建二叉树,它接受中序序列 `inorder` 和后序序列 `postorder` 作为参数。算法先判断输入的中序序列是否为空,如果是,返回空结点;否则,我们取后序序列的最后一个元素作为根结点,然后在中序序列中找到根结点的位置 `idx`,这样就可以确定左子树和右子树的中序序列。接下来,我们递归构造左右子树,并将它们分别连接到根结点的左右子树上。最后,返回根结点。
`preorderTraversal` 函数用于进行先序遍历,它接受根结点作为参数。算法先判断根结点是否为空,如果是,返回空列表;否则,我们先访问根结点,然后递归遍历左子树和右子树,最后将它们的遍历结果合并起来,并返回。
在主程序中,我们使用了您提供的示例数据进行了测试。算法输出结果为 `[3, 9, 20, 15, 7]`,符合预期。
阅读全文