C++ C++;二进制搜索树实现,动态数组还是结构/类?
我的任务是实现一个二进制搜索树,并遵循通常的结构路线:C++ C++;二进制搜索树实现,动态数组还是结构/类?,c++,struct,binary-search-tree,dynamic-arrays,C++,Struct,Binary Search Tree,Dynamic Arrays,我的任务是实现一个二进制搜索树,并遵循通常的结构路线: struct Node { int value; Node * left; Node * right; Node( int val ) { ... } } 当我考虑使用一个动态数组来实现它,并使用算术来计算左右节点时。我的问题是,数组实现是否会改变操作(插入、删除、按序遍历等)的时间和空间复杂性 我可以看出删除操作可能是个问题,重新组织数组并保持树的结构,但树的大小很小,最多100个节点
struct Node {
int value;
Node * left;
Node * right;
Node( int val ) {
...
}
}
当我考虑使用一个动态数组来实现它,并使用算术来计算左右节点时。我的问题是,数组实现是否会改变操作(插入、删除、按序遍历等)的时间和空间复杂性
我可以看出删除操作可能是个问题,重新组织数组并保持树的结构,但树的大小很小,最多100个节点
操作(插入、删除、按顺序行走等)的时间和空间复杂性会改变吗
在基于数组的树中插入和删除非叶节点需要移动数组中其后的所有元素。这将复杂性从O(logn)更改为O(nlogn)
数组实现是否比使用结构更好地使用内存
是的,毫无疑问。基于数组的树对缓存更友好,分配更少,而且不需要为每个节点存储指针
操作(插入、删除、按顺序行走等)的时间和空间复杂性会改变吗
在基于数组的树中插入和删除非叶节点需要移动数组中其后的所有元素。这将复杂性从O(logn)更改为O(nlogn)
数组实现是否比使用结构更好地使用内存
是的,毫无疑问。基于数组的树对缓存更友好,分配更少,而且不需要为每个节点存储指针。只需使用
std::map
或std::set
您的意思是node*left
和node*right
?正如您所说的,内存效率会更好。现在,每个节点都有自己加上一个指针,在一个64位系统中,指针是64位的。有了索引,它将只保存整数大小的附加信息。正如你所说,删除会有一些问题。当然,你可以做的是让被删除的节点留在向量/数组/任何东西中,并且在必要时只清理它们(存在的C++节点太多),它们有一些无效的值来标记它们被删除。我将Node作为实际树中的一个内部类,使用私有指针。这是因为您很有可能在某个时间点返回节点指针,而现在,更改该指针可能会导致树不一致,无论您是在树中使用指针还是索引。@RichardCriten我正在尝试从头开始编写代码,除了map和set本质上是另一个struct实现不?只需使用std::map
或std::set
你的意思是Node*left
和Node*right
?正如你所说的,内存效率会更好。现在,每个节点都有自己加上一个指针,在一个64位系统中,指针是64位的。有了索引,它将只保存整数大小的附加信息。正如你所说,删除会有一些问题。当然,你可以做的是让被删除的节点留在向量/数组/任何东西中,并且在必要时只清理它们(存在的C++节点太多),它们有一些无效的值来标记它们被删除。我将Node作为实际树中的一个内部类,使用私有指针。这是因为您很有可能在某个时间点返回节点指针,而现在,更改该指针可能会导致树不一致,无论您是在树中使用指针还是索引。@RichardCriten我正在尝试从头开始编写代码,除了map和set之外,还有另一个struct实现吗?