【问题标题】:Can you draw a binary tree given its pre-order binary sequence/ordering?给定它的前序二进制序列/排序,你能画出一棵二叉树吗?
【发布时间】:2016-05-10 07:20:01
【问题描述】:

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

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

反之亦然吗?如果给我这个二进制序列11011000101101010001,我可以画出二叉树吗?

【问题讨论】:

  • 那么如果一棵树只有一个节点,它的表示会是100吗?

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


【解决方案1】:

是的,你可以。

将内部节点标记为a,将外部节点标记为b;当然你可以假设a0b1(反之亦然)。但我认为区分字母比区分数字更容易(尽管这是“味道”的问题)。

如果你不知道什么是“外部节点”,那么你可以假设它们是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's 和b's 组成的单词都属于 Lukasiewicz 语言。但是可以对它们应用一些可显示的规则。

首先,b 的数量必须恰好是 a 的数量加一。其次,如果每个 a 的权重为一 (1),而每个 b 的权重为减一 (-1),则除最后一个 b 外,每个字母的所有单词的加法永远不会小于零。仅在单词末尾添加-1。如果这个词不满足这个条件,那么你可以认为它是无效的。

【讨论】:

  • 做得很好。但是请注意,根据此解决方案(顺便说一句,我认为这是正确的),OP 的示例字符串 11011000101101010001 不是有效的树。
【解决方案2】:

当然!

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

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

这些是您的索引。

为您的节点数据定义一个大小,您可以在 data_size * index 处获取树中节点的信息

这通常是堆的表示方式。

有很多方法可以将二叉树表示为字符串。但是,因为有很多方法你必须在一个特定的表示上达成一致,然后你才能继续前进。我上面提到的只是表示二叉树的一种方式,可能不是你们都在使用的标准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    相关资源
    最近更新 更多