如何基于预订和按顺序或后序和顺序遍历构建非二叉树?

时间:2013-04-18 17:28:01

标签: algorithm tree inorder preorder postorder

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

  

构造其前序遍历为的树:1,2,5,3,6,10,7,   11,12,4,8,9和inoder遍历为5,2,1,10,6,3,11,7,12,   8,4,9。

     

构造后序遍历的树:5,2,10,6,11,12,   7,3,8,9,4,1和inoder遍历为5,2,1,10,6,3,11,7,   12,8,4,9。

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

1 个答案:

答案 0 :(得分:2)

我不确定我是否可以为此提供精确的算法解决方案,但我可以给出一个应该足够的概念算法。我想如果你可以将它微调到一个明确定义的算法,它对你有用,并使(那部分)中期琐碎。

首先,考虑一下inorder遍历遍历树的方式。如果你绘制树,使最左边的孩子在左边(视觉上)而其他孩子在右边(视觉上),那么inorder遍历从左到右。您可能遇到一个问题,它不是从左到右(因为一个节点的子节点与父节点之间有一些重叠或类似的东西),但您可以随时拉伸树以使其明显“从左到右”。所以我利用它 用inorder遍历开始我的树:

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

然后我们的想法是根据前序遍历来上下移动节点。这部分是很难定义的部分。基本上,如果他们“更早”访问节点,则将节点向上移动,如果稍后访问节点则将其移动。所以,例如,1是在前序遍历的2和5的左边,所以我把它提升到了“up”,因为我做了2和5个祖先(但不一定是孩子)的1.所以像

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

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

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

然后你会看到在前序遍历的6和10之前有3,所以我们可以“提升”它。

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

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