我可以从给定的dfs遍历中形成二叉树吗? 我的意思是,说我有顺序,预订,后序或三者中的所有这些,我可以从这些遍历中获得一个唯一的二叉树吗?与另一棵树没有歧义吗?
答案 0 :(得分:0)
您可以恢复任何二叉树,因为它预先遍历所有节点,包括外部节点。为此,您必须将内部节点与外部节点区分开来。外部节点是空树,在许多实现中等同于NULL
指针。
例如,对于以下二叉树
内部节点标有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;
}
当然,该算法假设有效的预订序列。
如果将密钥存储在内部节点中,则可以使用特殊键表示空树,算法也是相同的。