二叉树(以及因此有序的森林)可以表示为二进制字符串。二进制字符串是通过预先遍历二叉树获得的,每个节点记录1,每个空子树记录一个0(空链接)。
这意味着如果我给出了二叉树,我可以进行前序遍历并生成二进制序列表示。
是否可能相反?如果我给出了这个二进制序列11011000101101010001
,我可以绘制二叉树吗?
答案 0 :(得分:7)
是的,你可以。
将内部节点标记为a
,将外部节点标记为b
;当然,您可以将a
视为0
,将b
视为1
(反之亦然)。但我认为区分字母比数字更容易(尽管这是"味道")。
如果您不知道"外部节点"是什么,那么您可以假设它们是NULL
指针。
现在,标记为我所说的任何树的前序遍历形成了属于Lukasiewicz语言的单词。可以证明这个词是独一无二的。也就是说,对于任何一对树t1
和t2
,code(t1) != code(t2)
;总是!另外(这应该是您关注霍夫曼编码的原因),Lukasiewicz语言是前缀。
例如,对于树
其前序遍历为aaaabbabbaabbbababb
或000011011001110111
我留给你生成代码的代码;这是一个前序遍历。如果你有兴趣反转它,也就是说,为了给代码提供树,那么这个试图回答你问题的伪代码就可以了:
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
这通常是表示堆的方式。
有很多方法可以将二叉树表示为字符串。但是,因为在你可以前进之前,有很多方法你必须就特定的代表达成一致。我上面提到的只是表示二叉树的一种方式,它可能不是你们所有人使用的标准。