Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tree 从给定数据构建二叉树_Tree_Integer_Binary Tree_Binary Search Tree - Fatal编程技术网

Tree 从给定数据构建二叉树

Tree 从给定数据构建二叉树,tree,integer,binary-tree,binary-search-tree,Tree,Integer,Binary Tree,Binary Search Tree,我很难理解如何从给定的一组数字构建一个二叉树 30 15 4 NULL NULL 20 18 NULL 19 NULL NULL NULL 35 32 NULL NULL 38 NULL NULL 我翻阅了我的书和笔记,似乎弄不明白。NULL是什么意思?如果你能给我看一棵正确的树,那将非常有帮助,我是一个非常直观的人。我已经更改了作业中的值和NULL顺序,所以不要担心我没有从中学习

我很难理解如何从给定的一组数字构建一个
二叉树

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

我翻阅了我的书和笔记,似乎弄不明白。
NULL
是什么意思?如果你能给我看一棵正确的树,那将非常有帮助,我是一个非常直观的人。我已经更改了作业中的值和
NULL
顺序,所以不要担心我没有从中学习
                +--+
                |30|
          +------------------+
          |                  |
       +--+                 ++-+
       |15|                 |35|
  +------------+         +----------+
  |            |       +--+       +--+
+-+          +-++      |32|       |38|
|4|          |20|      +--+       +--+
+-+          +--+
       +-----+
       |18|
       +---+
           |
           +----+
             |19|
             +--+

现在,如果您再次查看该列表,您将看到
NULL
表示何时停止
30
有一个孩子,
15
15
有一个孩子
4
4
没有孩子(后跟两个
NULL
),往上一个,
15
有第二个孩子
20
20
有一个孩子:
18
18
没有左边的子项(后面用
NULL
表示),但有右边的子项
19
。它没有任何子项(两个
NULL
s)
20
也没有更多的子节点:
NULL
导致
15
的另一个子节点:
35
,等等。

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

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

我假设空值表示列表中的前一个节点只有一个叶节点或没有叶节点


对于树结构中的节点排序,要使其成为二叉搜索树,每对叶节点应大于或小于父节点,通常较小的值应为左侧叶节点。这意味着您可以从根开始搜索树,然后选择较高或较低的叶节点,沿着树向下遍历,直到找到所需的节点

您的问题很可能涉及Łukasiewicz代码

给定一棵二叉树,Łukasiewicz代码是由完整的前序遍历生成的序列,其中内部节点用
a
标记,外部节点(空指针)用
b
标记。“a
/
b”的使用是惯例问题。你可以使用任何其他符号;例如,比特

例如,这棵树

哪个应该是与您的问题对应的树,其asŁukasiewicz代码顺序如下:

aaabbababbaabbabb

考虑使用外部节点绘制同一棵树。一些,比如

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

现在执行一次预排序遍历。当找到外部节点(即空指针)时,打印
NULL
eol
。当您找到一个内部节点(与
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
/my program

我想你需要把树一层一层地建好。在前两个分支30和15的末端;30岁以下有4和空,15岁以下有空和20。你下一层楼:4岁以下有18和空(空和空下没有任何内容),20岁以下有19和空等等。空似乎意味着分支末尾没有任何内容。这不是二叉树。