我无法理解如何从给定的数字集合中构建binary tree
...
30
15
4
NULL
NULL
20
18
NULL
19
NULL
NULL
NULL
35
32
NULL
NULL
38
NULL
NULL
我已经阅读了我的书和笔记,似乎无法弄明白。 NULL
&是什么意思?如果你能告诉我一棵正确的建筑树,它是最有帮助的,我是一个非常有视觉的人。我已经从作业中改变了价值和NULL
订单,所以不要担心我没有从中学习!
答案 0 :(得分:2)
如果你只考虑这里的数字是二叉树的样子:
+--+
|30|
+------------------+
| |
+--+ ++-+
|15| |35|
+------------+ +----------+
| | +--+ +--+
+-+ +-++ |32| |38|
|4| |20| +--+ +--+
+-+ +--+
+-----+
|18|
+---+
|
+----+
|19|
+--+
现在,如果再次查看列表,您会看到NULL
表示何时停止。 30
有一个孩子,15
,15
有一个孩子4
,4
没有孩子(后面跟着两个NULL
) ,向上一个,15
有第二个孩子20
,20
有一个孩子:18
。 18
没有留下孩子(之后用NULL
表示),但有一个正确的孩子19
。它没有任何孩子(两个NULL
)。 20
还没有更多孩子:NULL
导致15
其他孩子:35
等。
答案 1 :(得分:1)
很可能你的问题涉及Łukasiewicz代码。
给定二叉树,Łukasiewicz代码是完整的前序遍历生成的序列,其中内部节点标记为a
,外部节点(空指针)标记为b
。使用'a /
b`是惯例问题。你可以使用任何其他符号;例如,比特。
例如,这棵树
应该是与您的问题相对应的树,具有以下序列的Łukasiewicz代码:
aaabbaababbbaabbabb
考虑使用外部节点绘制相同的树。一些如
在此图中,每个外部节点都使用水平条绘制。每个外部节点都是NULL指针。
现在执行前序遍历。当您找到外部节点(即NULL指针)时,您打印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
et voila!
答案 2 :(得分:0)
我假设第一个节点指示树的根节点。
列表中的以下两个节点是立即离开。
我认为NULL值表明列表中的前一个节点只有一个叶子或没有叶子节点。
对于树结构中的节点排序,对于它是二叉搜索树,每对叶节点应该大于或小于父节点,并且通常较小的值应该是左手叶节点。这意味着您可以通过从根开始并选择更高或更低的叶节点来搜索树,遍历树直到找到所需的节点。