我试图弄清楚如何从二叉搜索树中删除一个节点,我知道每个节点都是不同的,无论它是一片叶子,有一个孩子还是两个孩子。到目前为止,我的功能仅仅是:
bool BinSTree::remove_root(treeNode*& node) {
if(node -> left == NULL && node -> right == NULL) {
}
elseif(node -> left != NULL && node -> right != NULL) {
}
else {
}
}
我很难理解逻辑,例如我知道所有这些我需要能够找到被删除节点的父节点,这是我无能为力和任何帮助的地方非常感谢!
答案 0 :(得分:3)
这听起来像是家庭作业。您可能会找到this article on binary tree rotation to be helpful。除了为您提供有关如何处理一些有趣案例的一些提示外,该文章还将向您展示如何为自己绘制问题的方法。
从树中删除是一个有趣的案例,我记得当我在80年代后期在C中编写自己的AVL树实现时,对此感到困惑。
答案 1 :(得分:0)
首先,你的函数也应该有一个父元素的参数(除非你的树有指向父母的指针,听起来不是这样)。
通过这种改变,你应该更容易找出其余部分。但如何你称这个功能变得很重要。
注意:我认为这是作业,所以我不想提供全面的答案。
此外,对于删除一个节点后如何处理节点的逻辑(如何重新链接它们),尝试绘制一些图表。
答案 2 :(得分:0)
This wiki page可能有所帮助。
答案 3 :(得分:0)
除了其他答案(假设这是家庭作业,重点是学习),你可能会发现Niklaus Wirth的"Algorithms + Data Structures = Programs"非常有启发性,无论是一般情况还是你的特定问题。
这是一本经典的小书,一本宝石。
希望在离你最近的(大学?)图书馆有售?
干杯&第h。,
答案 4 :(得分:0)
删除节点时,
- 如果它是一片叶子,你就完成了。
- 如果有一个孩子,请提升孩子,然后从子树中删除孩子(通过自己打电话)
- 如果它有两个孩子,请选择要推广的孩子,然后从子树中删除该孩子(通过自己打电话)。
有时你挑选的两个孩子中的哪一个取决于像 - 子树的根是子树中所有节点中最少的 - 子树的根是子树中所有节点中的大部分 - 必须保留一些着色或其他副作用
这应该会让你偏离高中心。