【问题标题】:Serialize a tree using DFS使用 DFS 序列化树
【发布时间】:2014-10-16 10:24:20
【问题描述】:

根据this post on Wikipedia,给定具有不同元素的树,前序或后序与有序配对足以唯一地描述树。但是,前序与后序在树结构中留下了一些歧义。

我正在寻找一个可以证明这一主张的简单示例。

所以给定以下树:

顺序是:

Pre Order:  1, 2, 4, 3, 5, 7, 8, 6
In Order:   4, 2, 1, 7, 5, 8, 3, 6
Post Order: 4, 2, 7, 8, 5, 6, 3, 1

如何使用它的 Pre OrderIn OrderPost OrderIn Order 反序列化这棵树?

谢谢

【问题讨论】:

  • 制作的树不是二叉搜索树,而是二叉树。
  • @NikunjBanka:好的,谢谢,我相应地更新了标题。
  • @barakmanos 检查维基百科文章引用的来源,那里有解释:cs.stackexchange.com/questions/439/…

标签: algorithm tree graph-algorithm depth-first-search


【解决方案1】:

因此声明是,给定树的前序和中序遍历,我们可以唯一地构造树。

在你的例子中
预购:1、2、4、3、5、7、8、6
按顺序:4、2、1、7、5、8、3、6

现在树中的根节点将是前序遍历中的第一个节点。此外,在中序遍历中出现在值之前的所有数字都将位于以该节点为根的左子树中。同样,出现在一个值之后的所有值都将位于右子树中。因此,继续以这种递归方式将反序列化树。你可以在这里阅读更多信息http://www.geeksforgeeks.org/construct-tree-from-given-inorder-and-preorder-traversal/

同样,您可以根据树的后序和中序遍历对树进行反序列化。这里出现在后序遍历中的最后一个值将是树的根。您可以从这里http://www.programcreek.com/2013/01/construct-binary-tree-from-inorder-and-postorder-traversal/ 阅读有关后序和有序反序列化的信息

【讨论】:

  • 所以树的根是1,树的左边是4和2,树的右边是7、5、8、3和6。接下来是什么?
  • 递归地为左半边序 = {4, 2} 和​​预序 = {2, 4}。返回的树是根为 1 的树的左子节点。右半部分 inorder = {7, 5, 8, 3, 6} 和 preorder = {3, 5, 7, 8, 6}。
  • 好的,所以我使用 PreOrder 找到树的根,然后使用 InOrder 找到树的左侧和右侧。然后,我取左侧,找到第一个出现在 PreOrder 中的值。该值是左子树的根。现在,我回到 InOrder 并找到该子树的左侧和右侧。在此示例中,左侧仅包含值 4。但要确定右侧包含的内容并不容易。在这个例子中它是空的,但是你如何有效地确定它呢?
猜你喜欢
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 2010-10-18
  • 2021-11-14
  • 1970-01-01
相关资源
最近更新 更多