algorithm - 我们能否构造一棵只有后序遍历或前序遍历的满二叉树?

标签 algorithm data-structures

比如我们只提供后序遍历数组或者只提供前序遍历数组。我们可以重建二叉树吗?如果我们知道二叉树是满的。此外,如果不是,如果同时知道前序和后序,是否可以构造完整的二进制文件?

最佳答案

不,您不能仅从一个列表中选择。

想想后序列表:4 5 2 3 1

    1         1   
   / \       / \
  2   3     4   3
 / \           / \
4   5         5   2

两棵树都是可能的,但我们不知道是哪一棵生成了列表

假设树中的每个元素都是唯一的,我们知道预序是这样构建的:

[Node][     LeftTree     ][     RightTree     ]

和这样的后序:

[     LeftTree     ][     RightTree     ][Node]

如果我们有两个列表,前序 1 2 4 5 3 和后序 4 5 2 3 1,我们知道 1 是树的根,因为它是前序列表的第一个数字(也是后序列表的最后一个数字)。此外,我们知道 2 必须是左树的根,3 必须是右树的根,因为它们是根节点之后的第一个数字,它们是左树或右树。考虑到这一点,我们可以将列表拆分为:

           [Root in preorder] [ LeftTree ] [RightTree] [Root in postorder]
preorder:        [1]             [2 4 5]      [3]     
postorder:                       [4 5 2]      [3]              [1]   

从这里你可以用左树和右树递归地执行这个算法,最后你得到这个:

    1     
   / \      
  2   3    
 / \       
4   5

由于每个元素都是唯一的,因此只有一种构建树的方法,因此您可以从其后序和前序列表中重建一棵树。

如果您有相同的元素,则无法构建唯一的树,例如:

preorder:  1 X X 5 X
postorder: X 5 X X 1

从这些列表中,您可以创建这两棵树:

    1         1   
   / \       / \
  X   X     X   X
 / \           / \
X   5         5   X

关于algorithm - 我们能否构造一棵只有后序遍历或前序遍历的满二叉树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23112589/

相关文章:

python - 如何对大型数据集进行分组

math - 大 O 代数简化

arrays - 如何解决具有递归关系作为数组元素的大和 10^18 的子集和问题

c# - 我在这个 C# 合并排序算法中做错了什么?

java - 如何使用摘要列表

algorithm - 多项式时间缩减传递性证明

algorithm - 从中序和前序重建二叉树

java - 具有 "object expiration"的对象缓存数据结构

javascript - 给定一棵树,一个开始叶子和一个结束叶子,将它分成最多 3 个部分

java - 三元算子用调车场算法解析