C++ 通过数组实现BST,通过链表实现堆

C++ 通过数组实现BST,通过链表实现堆,c++,data-structures,C++,Data Structures,我目前正在学习数据结构,并尝试实现BST和max堆(使用BST作为基类)。但我意外地发现,似乎不可能从BST派生heap。几乎所有heap的实现都基于数组,而不是使用指向左侧和右侧的指针,并且大多数BST都基于指针而不是数组 所以我的问题是为什么我必须使用数组来实现堆?而且,在实现BST时,为什么人们选择使用指向左侧和右侧的指针而不是数组?我知道用数组来实现BST可能会占用更多的空间,而且删除函数的实现也比较困难,还有其他原因吗 非常感谢你 使用数组完成二进制堆的标准实现的主要原因是,因为堆是完

我目前正在学习数据结构,并尝试实现BST和max堆(使用BST作为基类)。但我意外地发现,似乎不可能从BST派生heap。几乎所有heap的实现都基于数组,而不是使用指向左侧和右侧的指针,并且大多数BST都基于指针而不是数组

所以我的问题是为什么我必须使用数组来实现堆?而且,在实现BST时,为什么人们选择使用指向左侧和右侧的指针而不是数组?我知道用数组来实现BST可能会占用更多的空间,而且删除函数的实现也比较困难,还有其他原因吗


非常感谢你

使用数组完成二进制堆的标准实现的主要原因是,因为堆是完整的二叉树。

因为完整的二叉树总是逐级增长(意思是:首先父级将被节点填充,然后子级才被填充)

因此,我们能够使用数组,其中对于位于位置
i
的节点,左子节点位于位置
2*i
,右子节点位于位置
2*i+1


使用指针而不使用数组实现二元搜索树的原因是,不能保证二元搜索树是完整的二元树。

使用数组实现二元堆的主要原因是,因为堆是完整的二元树。

因为完整的二叉树总是逐级增长(意思是:首先父级将被节点填充,然后子级才被填充)

因此,我们能够使用数组,其中对于位于位置
i
的节点,左子节点位于位置
2*i
,右子节点位于位置
2*i+1


二进制搜索树使用指针而不使用数组实现的原因是二进制搜索树不能保证是完整的二进制树

几乎所有堆的实现都基于数组而不是使用指针
:错了,实际上效率很低。例如,参见Glibc的。一个简单的数组不可能有超过5000行的代码!那个么BST呢,人们会喜欢指针而不是数组吗?我不太明白你们的意思。也许你需要进一步研究这些主题?@XiangyuZhang可以自由地进行任何查询。@KemyLand
malloc()
没有实现二进制堆,这就是问题所在。
几乎所有堆的实现都是基于数组而不是使用指针的。
:错,这在现实中是非常低效的。例如,参见Glibc的。一个简单的数组不可能有超过5000行的代码!那个么BST呢,人们会喜欢指针而不是数组吗?我不太明白你们的意思。也许你需要进一步研究这些主题?@XiangyuZhang可以自由地进行任何查询。@KemyLand
malloc()
没有实现二进制堆,这就是问题所在。