我的数据结构和算法类的两个练习听起来像这样
构造其前序遍历为的树: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。
我只需绘制树的结构,而不用编程语言实现它。使这项任务更难的是树不是二叉树。我可以使用哪些技术来构建树木?
答案 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的子级...满足上述约束的树不是唯一的。