【问题标题】:Building a Binary Tree from Given Data从给定数据构建二叉树
【发布时间】:2015-11-11 22:59:28
【问题描述】:

我无法理解如何根据给定的一组数字构建binary tree...

30
15
4
NULL
NULL
20
18
NULL
19
NULL
NULL
NULL
35
32
NULL
NULL
38
NULL
NULL 

我浏览了我的书和笔记,但似乎无法弄清楚。 NULL 是什么意思?如果你能给我展示一个正确的构建树,那将是最有帮助的,我是一个非常有眼光的人。我已经更改了作业中的值和NULL 顺序,所以不要担心我没有从中学习!

【问题讨论】:

  • 我认为你需要逐层建造你的树。在前两个分支 30 和 15 的末端; 30岁以下有4个NULL,15岁以下有NULL和20个。你下一层楼:4岁以下有18个NULL(NULL和NULL以下没有),20岁以下有19个NULL等。NULL似乎表示分支的末尾没有任何内容。
  • 那不是二叉树。

标签: tree integer binary-tree binary-search-tree


【解决方案1】:

如果你只考虑这里的数字,二叉树应该是这样的:

                +--+
                |30|
          +------------------+
          |                  |
       +--+                 ++-+
       |15|                 |35|
  +------------+         +----------+
  |            |       +--+       +--+
+-+          +-++      |32|       |38|
|4|          |20|      +--+       +--+
+-+          +--+
       +-----+
       |18|
       +---+
           |
           +----+
             |19|
             +--+

现在,如果您再次浏览该列表,您将看到NULL 表示何时停止。 30有孩子,1515有孩子44没有孩子(后面跟着两个NULLs),上一个,15有第二个孩子2020 有一个孩子:1818 没有左孩子(后面用NULL 表示),但有一个右孩子19。它没有任何孩子(两个NULLs)。 20 也没有更多的孩子:NULL 导致15 的另一个孩子:35

【讨论】:

    【解决方案2】:

    您的问题很可能与 Łukasiewicz 代码有关。

    给定一棵二叉树,Łukasiewicz 码是由完整的前序遍历生成的序列,其中内部节点标记为a,外部节点(NULL 指针)标记为b。 'a/b' 的使用是约定俗成的。您可以使用任何其他符号;比如位。

    例如,这棵树

    这应该是与您的问题相对应的树,作为 Łukasiewicz 代码具有以下序列:

    aaabbaababbbaabbabb

    考虑绘制相同的树,但带有外部节点。一些如

    在此图中,每个外部节点都用水平条绘制。每个外部节点都是一个 NULL 指针。

    现在执行前序遍历。当您找到一个外部节点(即 NULL 指针)时,您会打印 NULLeol。当您找到一个内部节点(与NULL 不同的任何东西)时,您会打印键值加上eol

    您将获得您提供的确切序列。

    因此,任务是从这种 Łukasiewicz 遍历中重建原始树。这样的任务可以通过这样的例程来完成:

    Node * to_tree(istream & input)
    {
      string val;
      input >> val;
      if (val == "NULL")
        return nullptr;
    
      Node * p = new Node;
      p->get_key() = atoi(val.c_str());
      p->left  = to_tree(input);
      p->right = to_tree(input);
    
      return p;
    }
    

    如果序列生成正确,那么您可以安全地调用此函数而没有任何风险;它会完成的。如果您有兴趣验证输入,那么您可以进行预处理。您将计数器初始化为零。每次找到一个键时,您加 1,当您找到 NULL 时,您减 1。正确的序列必须在末尾产生 -1。这是因为n 节点的所有二叉树都有n + 1 外部节点(或NULL 指针)。最后访问的节点是外部的,这是计数器达到 -1 的唯一也是最后一次。

    你可以让他的例程适应你的树实现并编写一个程序:

    int main(int, char **)
    {
      Node * root = to_tree(cin);
      return 0;
    }
    

    你编译它然后你执行:

    ./my-program < my-input
    

    瞧!

    【讨论】:

      【解决方案3】:

      我假设第一个节点表示树的根节点。

      列表中的以下两个节点是直接叶子。

      我假设 NULL 值表示列表中的前一个节点要么只有一个叶子节点,要么没有叶子节点。

      对于树结构中的节点排序,对于二叉搜索树来说,每对叶子节点应该大于或小于父节点,通常较小的值应该是左边的叶子节点.这意味着您可以通过从根开始并选择较高或较低的叶节点来搜索树,向下遍历树直到找到所需的节点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-06
        • 1970-01-01
        • 1970-01-01
        • 2019-10-18
        相关资源
        最近更新 更多