如何基于 preorder&inorder 或 postorder&inorder 遍历构造非二叉树?

Posted

技术标签:

【中文标题】如何基于 preorder&inorder 或 postorder&inorder 遍历构造非二叉树?【英文标题】:How do I construct a non-binary tree based on the preorder&inorder or postorder&inorder traversal? 【发布时间】:2013-04-18 17:28:01 【问题描述】:

我的数据结构和算法课的两个练习听起来像这样

构造前序遍历为:1、2、5、3、6、10、7、 11, 12, 4, 8, 9, inode 遍历是 5, 2, 1, 10, 6, 3, 11, 7, 12, 8、4、9。

构造后序遍历为:5, 2, 10, 6, 11, 12, 7, 3, 8, 9, 4, 1, inode 遍历是 5, 2, 1, 10, 6, 3, 11, 7, 12、8、4、9。

我只需要绘制树的结构,而不用编程语言实现它。使这项任务变得更难的是树不是二叉树。我可以使用哪些技术来构建树?

【问题讨论】:

是的,这是有道理的..但这是我期中可能的主题之一。 你 100% 确定它们不是二叉树吗?如果我是你,我会假设他们是,因为这是有序的要求。 一些有用的注意事项 - 第一个节点是预购的,而后购的最后一个节点始终是根。第二个和倒数第二个节点是根的子节点之一,您可以通过在中序遍历中查看它们与根的关系来确定是哪一个。 我确定,这棵树应该是这样的:i.imgur.com/RESf0kk.png @Turdor Ciotlos 您可以将图像中的树转换为满足条件的二叉树。只需将以4 为根的子树移动到 12 的“右”子树。是什么让你认为它不可能是二叉树? 【参考方案1】:

我不确定我能否给出一个精确的算法解决方案,但我可以给出一个足够的概念性解决方案。我认为,如果您可以将其微调为定义明确的算法,那将对您很有用,并使期中考试的(那部分)变得微不足道。

首先,考虑中序遍历如何遍历树。如果您绘制树使得最左边的孩子在左边(视觉上)而其他孩子在右边(视觉上),那么中序遍历松散地从左到右。您可能会遇到一个问题,即它不是完全从左到右(因为一个节点的子节点和父节点之间有一些重叠或类似的东西),但您始终可以将树拉伸以使其清楚地“从左到右”。所以我利用这一点 以中序遍历开始我的树:

5 2 1 10 6 3 11 7 12 8 4 9

那么想法是我们根据前序遍历上下移动节点。这部分是很难定义的部分。基本上,如果“较早”访问节点,则将它们向上移动,如果稍后访问它们,则将它们向下移动。因此,例如,1 在前序遍历中位于 2 和 5 的左侧,所以我将其“向上”提升,因为我创建了 1 的 2 和 5 个祖先(但不一定是孩子)。所以类似于

   1
5 2 10 6 3 11 7 12 8 4 9

然后你看到 2 在 5 之前,所以我提出了 2:

    1
  2 
5     10 6 3 11 7 12 8 4 9

然后您会在前序遍历中看到 3 在 6 和 10 之前,因此我们可以“提升”它。

    1
  2        3
5     10 6   11 7 12 8 4 9

等等。请注意,3 最终可能是 2 或 1 的子节点...满足上述约束的树不是唯一的。

【讨论】:

谢谢! postorder&inorder 呢?我知道根是后序遍历的最右边的元素,但是我应该采取哪些步骤来创建树? 我实际上并没有尝试过,但我很确定如果它在后序遍历中比在中序遍历中更早(而不是向上),您可以反转逻辑并将其拉下)。

以上是关于如何基于 preorder&inorder 或 postorder&inorder 遍历构造非二叉树?的主要内容,如果未能解决你的问题,请参考以下文章

Inorder 从“最左边的节点”开始,那么为啥 Preorder 不从“最左边的中间节点”开始?

105. Construct Binary Tree from Inorder and preorder Traversal

105. Construct Binary Tree from Preorder and Inorder Traversal

Construct Binary Tree from Preorder and Inorder Traversal

Construct Binary Tree from Preorder and Inorder Traversal

LeetcodeConstruct Binary Tree from Preorder and Inorder Traversal