Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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
C++ 在二进制搜索树中是否需要结构_C++_Struct_Binary Tree_Binary Search - Fatal编程技术网

C++ 在二进制搜索树中是否需要结构

C++ 在二进制搜索树中是否需要结构,c++,struct,binary-tree,binary-search,C++,Struct,Binary Tree,Binary Search,我看过一些BST的代码,我可以看到每个节点都是一个结构。这是必要的吗?不,可能是一门课。它不能是原语,因为它需要存储一个值并指向子级 我应该说,你也可以把你的BST表示成一个数组,其中在位置I的节点的左、右子节点分别位于位置2*I+1和2*I+2。但是,您将不得不担心调整大小,并且需要一个特殊的值来表示null,删除操作变得非常复杂。除了学术练习,我不推荐这种方法。不,它可能是一门课。它不能是原语,因为它需要存储一个值并指向子级 我应该说,你也可以把你的BST表示成一个数组,其中在位置I的节点的

我看过一些BST的代码,我可以看到每个节点都是一个结构。这是必要的吗?

不,可能是一门课。它不能是原语,因为它需要存储一个值并指向子级


我应该说,你也可以把你的BST表示成一个数组,其中在位置I的节点的左、右子节点分别位于位置2*I+1和2*I+2。但是,您将不得不担心调整大小,并且需要一个特殊的值来表示null,删除操作变得非常复杂。除了学术练习,我不推荐这种方法。

不,它可能是一门课。它不能是原语,因为它需要存储一个值并指向子级

我应该说,你也可以把你的BST表示成一个数组,其中在位置I的节点的左、右子节点分别位于位置2*I+1和2*I+2。但是,您将不得不担心调整大小,并且需要一个特殊的值来表示null,删除操作变得非常复杂。除了学术练习之外,我不推荐这种方法。

这不是强制性的。但是,由于节点包含的数据以及两个链接一起构成一个逻辑实体,它们通常放在一个结构中。因此,编写将节点作为参数或返回节点的函数变得更容易。

这不是强制性的。但是,由于节点包含的数据以及两个链接一起构成一个逻辑实体,因此它们通常放在一个结构中。因此,编写将节点作为参数或返回节点的函数变得更加容易

int flat_tree[ 1000 ][ 3 ];
    // for each tree node, value is stored in element [id][0]
                        // id of left_child stored in element [id][1]
                        // id of right_child stored in element [id][2]

我不想再谈这个了

一般来说,结构/类用于任何类型的链接数据结构。通常情况下,类型系统的任何特性都可能被破坏或忽略,您可以在一个int数组中以非常痛苦的方式完成堆分配等所有操作

我不想再谈这个了


一般来说,结构/类用于任何类型的链接数据结构。通常情况下,类型系统的任何功能都可能被破坏或忽略,您可以在一个int数组中以非常痛苦的方式完成堆分配等所有操作。

不,严格来说不是。在FORTRAN时代,人们使用并行数组或二维数组


Dahl、Dijkstra和Hoare撰写的Tony Hoare的结构化编程部分讨论了数据结构和记录类型。

不,严格来说不是。在FORTRAN时代,人们使用并行数组或二维数组


Dahl、Dijkstra和Hoare撰写的Tony Hoare的结构化编程部分讨论了数据结构和记录类型。

如果有效负载允许一个前哨值,则可以做比并行数组更简单的事情:可以使用隐式树,即根本不需要链接

payload_type a[tree_size];
只是一个仅包含有效载荷值的长平面阵列,其在阵列中的位置编码为链路结构:

[0]是根 [1]是根->左 [2]是根->右 [3]是根->左->左 [4]是根->左->右 ... 对于位置i处的节点,向左转到2*i+1,向右转到2*i+2


您可以将其初始化为所有sentinal值,然后开始添加内容…

如果您的负载允许sentinal值,则可以执行比并行数组更简单的操作:您可以使用隐式树,而不必担心链接

payload_type a[tree_size];
只是一个仅包含有效载荷值的长平面阵列,其在阵列中的位置编码为链路结构:

[0]是根 [1]是根->左 [2]是根->右 [3]是根->左->左 [4]是根->左->右 ... 对于位置i处的节点,向左转到2*i+1,向右转到2*i+2


您将其初始化为所有sentinal值,然后开始添加内容…

Oops,我没有看到您的答案。我想你的意思是3*I+2,3看起来更好。。。这种混乱是一个很好的理由,为什么我们应该使用结构。这基本上是罗伯特·W·弗洛伊德(Robert W.Floyd)从ACM提出的Treesort 3排序算法245背后的技术。它是在Quicksort发布两年后发布的。它具有对数N性能,但作为非递归算法提出。有关血淋淋的详细信息,请参见Algol。您需要订阅ACM数字图书馆才能下载PDF。我觉得这钱很值!我现在明白了。这更像是一堆由内而外的垃圾。对于黑盒算法来说,它可能类似于一棵树,但是需要重建而不是重新链接的东西不能正确地称为树。当然,它可以称为树。树没有任何特定的实现——它只是一个有向的非循环图。哎呀,我没看到你的答案。我想你的意思是3*I+2,3看起来更好。。。这种混乱是一个很好的论据,说明为什么应该使用结构。这基本上就是罗伯特·W·弗洛伊德(Robert W.Floyd)的Treesort背后的技术
3来自ACM的排序算法245。它是在Quicksort发布两年后发布的。它具有对数N性能,但作为非递归算法提出。有关血淋淋的详细信息,请参见Algol。您需要订阅ACM数字图书馆才能下载PDF。我觉得这钱很值!我现在明白了。这更像是一堆由内而外的垃圾。对于黑盒算法来说,它可能类似于一棵树,但是需要重建而不是重新链接的东西不能正确地称为树。当然,它可以称为树。树没有任何特定的实现——它只是一个有向的非循环图,结构是不必要的。您可以改为使用类。在C++中,类默认为私有成员,在第一个公共或受保护声明之前类定义中的所有内容都是私有的。默认情况下,结构将成员作为公共成员。您所说的“必需”是什么意思?结构不是必需的。可以使用任何数据类型。BST需要有指向节点的指针,节点需要有内容,或者它们可以是指向数据的指针。例如,可以有一个void指针数组:void*tree_数组[200][3];其中最后一个维度用于左指针、数据指针和右指针。你有反对结构的东西吗?结构不是必需的。您可以改为使用类。在C++中,类默认为私有成员,在第一个公共或受保护声明之前类定义中的所有内容都是私有的。默认情况下,结构将成员作为公共成员。您所说的“必需”是什么意思?结构不是必需的。可以使用任何数据类型。BST需要有指向节点的指针,节点需要有内容,或者它们可以是指向数据的指针。例如,可以有一个void指针数组:void*tree_数组[200][3];其中最后一个维度用于左指针、数据指针和右指针。你有什么反对structs的吗?目前为止最好的答案是:同时,它给出了两个答案。理论上是否定的,实际上是肯定的。第二个维度可能会更容易做到这一点,索引值可以是0表示左侧,1表示数据,2表示右侧。@Thomas:相对而言;迄今为止的最佳答案:同时,它显示了两个答案。理论上是否定的,实际上是肯定的。第二个维度可能会更容易做到这一点,索引值可以是0表示左侧,1表示数据,2表示右侧。@Thomas:相对而言;v