从给定数据构建二叉树

时间:2015-11-11 22:59:28

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

我无法理解如何从给定的数字集合中构建binary tree ...

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

我已经阅读了我的书和笔记,似乎无法弄明白。 NULL&是什么意思?如果你能告诉我一棵正确的建筑树,它是最有帮助的,我是一个非常有视觉的人。我已经从作业中改变了价值和NULL订单,所以不要担心我没有从中学习!

3 个答案:

答案 0 :(得分:2)

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

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

现在,如果再次查看列表,您会看到NULL表示何时停止。 30有一个孩子,1515有一个孩子44没有孩子(后面跟着两个NULL) ,向上一个,15有第二个孩子2020有一个孩子:1818没有留下孩子(之后用NULL表示),但有一个正确的孩子19。它没有任何孩子(两个NULL)。 20还没有更多孩子:NULL导致15其他孩子:35等。

答案 1 :(得分:1)

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

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

例如,这棵树

enter image description here

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

  
    

aaabbaababbbaabbabb

  

考虑使用外部节点绘制相同的树。一些如

enter image description here

在此图中,每个外部节点都使用水平条绘制。每个外部节点都是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

et voila!

答案 2 :(得分:0)

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

列表中的以下两个节点是立即离开。

我认为NULL值表明列表中的前一个节点只有一个叶子或没有叶子节点。

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