📌  相关文章
📜  国际空间研究组织 | ISRO CS 2007 |问题 80(1)

📅  最后修改于: 2023-12-03 15:07:33.319000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2007 |问题 80

问题描述

给定一组关于树的遍历序列,判断是否能够恢复出唯一的二叉树。

输入格式
  • 输入的第一行是一个正整数 $T$,表示测试数据的组数。
  • 每组测试数据一开始都是两个正整数 $N$ 和 $L$,表示给定的遍历序列中,节点总数和序列长度($N\leq1000$,$L\leq2000$)。
  • 第二行是一个长度为$L$的非负整数序列,表示二叉树的前序遍历序列(根左右)。
  • 第三行是一个长度为$L$的非负整数序列,表示二叉树的后序遍历序列(左右根)。
输出格式
  • 对于每组数据,如果给定的遍历序列能够恢复出唯一的二叉树,则输出 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 代码片段。