将DFS转换为二叉树

时间:2016-04-06 14:43:44

标签: binary-tree traversal depth-first-search

我可以从给定的dfs遍历中形成二叉树吗? 我的意思是,说我有顺序,预订,后序或三者中的所有这些,我可以从这些遍历中获得一个唯一的二叉树吗?与另一棵树没有歧义吗?

1 个答案:

答案 0 :(得分:0)

您可以恢复任何二叉树,因为它预先遍历所有节点,包括外部节点。为此,您必须将内部节点与外部节点区分开来。外部节点是空树,在许多实现中等同于NULL指针。

例如,对于以下二叉树

enter image description here

内部节点标有a,外部标有b

所以前序遍历是

aaaabbabbaabbbababb

可以证明所有可能的预编码代码的语言都是单射的,因此,您可以反转预订序列并恢复原始树。

一些如(psudocode):

Node * preorder_to_tree(char *& ptr)
{
  if (*ptr++ == ''b')
    return nullptr;

  Node * p = new Node;
  LLINK(p) = preorder_to_tree(ptr);
  RLINK(p) = preorder_to_tree(ptr);

  return p;
}

当然,该算法假设有效的预订序列。

如果将密钥存储在内部节点中,则可以使用特殊键表示空树,算法也是相同的。