📅  最后修改于: 2023-12-03 15:07:33.319000             🧑  作者: Mango
给定一组关于树的遍历序列,判断是否能够恢复出唯一的二叉树。
yes
,否则输出 no
。2
8 17
1 2 4 7 8 5 3 6 5 8 7 4 2 6 3 1 3
4 7 8 5 2 8 7 4 6 5 3 2 7 8 4 6 3 1
8 17
1 2 4 7 8 5 3 6 5 8 7 4 2 6 3 1 3
4 7 8 5 6 8 7 4 6 5 3 2 7 8 4 2 1
yes
no
该题目需要我们根据前序遍历和后序遍历构造一棵二叉树,然后判断这棵二叉树是否与数组中给定的二叉树相同。可以使用递归的思路,找到根节点,然后对左子树和右子树进行同样的操作。找根节点可以在前序遍历中找到,根据前序遍历的性质,第一个元素即为根节点,然后在后序遍历中找到根节点位置,然后我们就可以得到左子树和右子树的前序遍历和后序遍历,使用递归即可构造整棵树。
def solution(pre, post):
if not pre: return "yes" # 遍历序列为空,即构造完毕,返回"yes"
if pre[0] != post[-1]: return "no" # 前后序遍历不一致,无法构造出唯一二叉树
root = pre[0]
left_len = post.index(pre[1]) + 1 # 左子树长度
right_len = len(pre) - left_len - 1 # 右子树长度
left_pre = pre[1:left_len+1] # 左子树前序遍历
left_post = post[:left_len] # 左子树后序遍历
right_pre = pre[left_len+1:] # 右子树前序遍历
right_post = post[left_len:-1] # 右子树后序遍历
return solution(left_pre, left_post) and solution(right_pre, right_post)
T = int(input())
for _ in range(T):
N, L = map(int, input().split())
pre_order = list(map(int, input().split()))
post_order = list(map(int, input().split()))
print(solution(pre_order, post_order))
这里给出的是 Python3 代码片段。