你可以根据预先订购的二进制序列/顺序绘制二叉树吗?

时间:2016-05-10 07:20:01

标签: data-structures binary-tree huffman-code

二叉树(以及因此有序的森林)可以表示为二进制字符串。二进制字符串是通过预先遍历二叉树获得的,每个节点记录1,每个空子树记录一个0(空链接)。

这意味着如果我给出了二叉树,我可以进行前序遍历并生成二进制序列表示。

是否可能相反?如果我给出了这个二进制序列11011000101101010001,我可以绘制二叉树吗?

2 个答案:

答案 0 :(得分:7)

是的,你可以。

将内部节点标记为a,将外部节点标记为b;当然,您可以将a视为0,将b视为1(反之亦然)。但我认为区分字母比数字更容易(尽管这是"味道")。

如果您不知道"外部节点"是什么,那么您可以假设它们是NULL指针。

现在,标记为我所说的任何树的前序遍历形成了属于Lukasiewicz语言的单词。可以证明这个词是独一无二的。也就是说,对于任何一对树t1t2code(t1) != code(t2);总是!另外(这应该是您关注霍夫曼编码的原因),Lukasiewicz语言是前缀。

例如,对于树

其前序遍历为aaaabbabbaabbbababb000011011001110111

我留给你生成代码的代码;这是一个前序遍历。如果你有兴趣反转它,也就是说,为了给代码提供树,那么这个试图回答你问题的伪代码就可以了:

Node * code_to_tree(char *& code)
{
  if (*code++ == 'b')
    return nullptr;

  Node * p = new Node;
  LLINK(p) = code_to_tree(code);
  RLINK(p) = code_to_tree(code);

  return p;
}

在实际实现中,您将读取位。

上面的例程假设代码是正确的;也就是说,它是从二叉树生成的。请注意,a&{39}和b组成的所有单词都不属于Lukasiewicz语言。但是可以对它们应用一些可显示的规则。

首先,b的数量必须正好是a的数量加一。其次,如果每个a加权一(1)个,每个b加权减去一(-1),那么,除了最后b之外,每个加权通过所有单词加字母永远不能小于零。只有在单词的最后,添加才会是-1。如果单词不满足这个条件,那么你可以认为它是无效的。

答案 1 :(得分:2)

当然!

创建二叉树,为每个元素分配一个数字

        0
   1----|-----2
 3-|-4     5--|--6
7|8 9|10 11|12 13|14
...

这些是你的指数。

定义节点数据的大小,您可以在data_size * index

中获取树中节点的信息

这通常是表示堆的方式。

有很多方法可以将二叉树表示为字符串。但是,因为在你可以前进之前,有很多方法你必须就特定的代表达成一致。我上面提到的只是表示二叉树的一种方式,它可能不是你们所有人使用的标准。