【发布时间】:2018-03-28 14:36:15
【问题描述】:
给定:
- 预购遍历。
- 后序遍历。
- 级别顺序遍历。
不能用 12 或 23 或 31 或即使给出 123 来构造二叉树!为什么是这样?以及为什么 InOrder Traversal 对于构造原始 Tree 非常重要?
【问题讨论】:
-
因为有两种不同的树产生相同的前序、后序和水平序遍历。找到一个例子是一个很好的练习。
给定:
不能用 12 或 23 或 31 或即使给出 123 来构造二叉树!为什么是这样?以及为什么 InOrder Traversal 对于构造原始 Tree 非常重要?
【问题讨论】:
如果没有中序遍历,我们就无法构建树。为什么?假设您只获得了前序遍历和后序遍历。一个简单的示例如下所示。
考虑两棵不同的树,
树 1:
root=a;
root->left=b;
root->left->right=c;
树 2:
root=a;
root->right=b;
root->right->left=c;
两棵树不同,但具有相同的前序和后序序列。
pre-order - a b c
post-order - c b a
这是因为我们不能单独使用前序或后序遍历来分离左子树和右子树。
预购,顾名思义,总是先访问根,再访问左右子树。也就是说,遍历一个预排序列表,我们命中的每个节点都是子树的一个“根”。
后序,顾名思义,总是先访问左右子树,再访问根。也就是说,向后遍历一个后序列表,我们命中的每个节点都是子树的一个“根”。
另一方面,按顺序总是先访问左子树,然后是根,然后是右子树,这意味着给定一个根(我们可以通过前序或后序遍历获得如上所述),中序遍历告诉我们给定根的左右子树的大小,因此我们可以构造原始树。(想想这个)
级别顺序遍历也是如此。因此,如果我们想要获得一棵唯一的树,我们需要一个中序遍历以及三个遍历中的任何其他遍历。
注意 - 当然,完整的二叉树除外,其中可以使用前序和后序遍历来构造树,因为树结构没有歧义。
【讨论】: