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和空等等。空似乎意味着分支末尾没有任何内容。这不是二叉树。