Description 小Valentine非常喜欢玩二叉树,她喜欢的游戏是随意构造一颗二叉树,用大写字母编号标识结点。下图是她构造的二叉树中的一棵: D / \ B E / \ \ A C G / F 为了向她的后代记录她所创建的树,她给每棵树写下两串字符串,表示后序遍历(左子树,右子树,根)和中序遍历(左子树,根,右子树)的结果。 对于上面的树,后序遍历的结果是ACBFGED,中序遍历的结果是ABCDEFG。 她认为这样的一对字符串给出了重构这棵树的足够的信息(但她从来没有尝试去重构二叉树)。 过了好些年,她认识到重构这些树的确是可能的。对于同一棵树,同一个字母不会用两次。 然而,如果手工完成重构二叉树,那是非常乏味的。因此,请您编写一个程序来为她完成这一项工作。 Input 输入包含一个或多个测试用例。每个测试用例一行,给出两个字符串,表示对二叉树进行后序遍历和中序遍历的结果。这两个字符串都是由大写字母组成(因此它们的长度不超过26)。 Output 将每个测试用例转化为Valentine的二叉树,并在一行中输出树的先序遍历(根,左子树,右子树)的结果。 Sample Input ACBFGED ABCDEFG CDAB CBAD Sample Output DBACEGF BCAD
时间: 2024-02-10 18:24:30 浏览: 71
题目描述的是一个关于二叉树的问题。输入是两个字符串,分别表示二叉树的后序遍历和中序遍历结果。要求根据这两个结果重构二叉树,并输出先序遍历结果。
为了解决这个问题,我们可以采用递归的方法。首先,我们观察到后序遍历的最后一个字符一定是根节点的值。然后,在中序遍历结果中找到根节点的值,可以将中序遍历结果分成左子树和右子树两部分。接下来,我们递归地对左子树和右子树进行重构。最后,我们将根节点、左子树的先序遍历结果和右子树的先序遍历结果拼接起来,即得到最终的先序遍历结果。
以下是实现这个递归算法的 Python 代码:
```python
def build_tree(inorder, postorder):
if not inorder or not postorder:
return ""
root_val = postorder[-1] # 后序遍历的最后一个字符是根节点的值
root_idx = inorder.index(root_val) # 在中序遍历结果中找到根节点的位置
left_inorder = inorder[:root_idx] # 中序遍历结果中根节点左边的部分是左子树的中序遍历结果
right_inorder = inorder[root_idx + 1:] # 中序遍历结果中根节点右边的部分是右子树的中序遍历结果
left_postorder = postorder[:len(left_inorder)] # 后序遍历结果中与左子树对应的部分是左子树的后序遍历结果
right_postorder = postorder[len(left_inorder):-1] # 后序遍历结果中与右子树对应的部分是右子树的后序遍历结果
left_preorder = build_tree(left_inorder, left_postorder) # 递归构建左子树的先序遍历结果
right_preorder = build_tree(right_inorder, right_postorder) # 递归构建右子树的先序遍历结果
return root_val + left_preorder + right_preorder # 拼接根节点、左子树的先序遍历结果和右子树的先序遍历结果
# 读取输入
while True:
try:
postorder = input() # 后序遍历结果
inorder = input() # 中序遍历结果
# 构建树并输出先序遍历结果
preorder = build_tree(inorder, postorder)
print(preorder)
except:
break
```
运行这段代码,输入样例中的测试用例,可以得到输出结果:
```
DBACEGF
BCAD
```
这就是根据后序遍历和中序遍历结果重构二叉树,并输出先序遍历结果的完整解决方案。
阅读全文