Algorithm 如何基于前序&;构造非二叉树;订购或延期订购&;有序遍历?

Algorithm 如何基于前序&;构造非二叉树;订购或延期订购&;有序遍历?,algorithm,tree,inorder,preorder,postorder,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,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


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

我不确定我能给出一个精确的算法解决方案,但我可以给出一个概念性的解决方案,应该足够了。我认为,如果你能将它微调到一个定义良好的算法,它将对你有用,并使(这部分)期中考试变得微不足道

首先,考虑一个有序遍历是如何遍历一棵树的。如果绘制树时,最左边的子对象向左(视觉上),其他子对象向右(视觉上),则顺序遍历从左到右松散地进行。您可能会遇到这样一个问题,即它不是完全从左到右(因为一个节点的子节点和父节点之间存在重叠或类似的情况),但您始终可以将树拉伸,使其清晰地“从左到右”。所以我利用了这个机会 使用顺序遍历开始我的树:

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之前,所以我们可以“提升”它


等等。请注意,3个孩子最终可能是2或1岁的孩子。。。满足上述约束条件的树不是唯一的。

是的,这是有意义的。但这是我期中考试的可能主题之一。你100%确定它们不是二叉树吗?如果我是你,我会假设它们是,因为这是顺序的要求。一些有用的注意事项-第一个节点是预顺序,最后一个节点是后顺序,始终是根。第二个和倒数第二个节点是根的子节点之一,您可以通过在顺序遍历中查看它们与根的关系来确定哪个节点。我确信,这就是树的外观:@Turdor Ciotlos您可以将映像中的树转换为满足条件的二叉树。只需将根在
4
的子树移动到12的“右”子树。什么让你认为它不可能是二叉树?谢谢!邮购和订单怎么样?我知道根是后序遍历最右边的元素,但是我应该采取什么步骤来创建树呢?我还没有真正尝试过它,但是我非常确定,如果它在后序遍历中出现的时间早于在顺序遍历中出现的时间(而不是向上),您可以反转逻辑并将其向下拉。
    1
  2        3
5     10 6   11 7 12 8 4 9