C ++删除节点二进制搜索树

时间:2010-10-20 23:35:47

标签: c++ data-structures binary-tree

我试图弄清楚如何从二叉搜索树中删除一个节点,我知道每个节点都是不同的,无论它是一片叶子,有一个孩子还是两个孩子。到目前为止,我的功能仅仅是:


bool BinSTree::remove_root(treeNode*& node) {
   if(node -> left == NULL && node -> right == NULL) {


   }
   elseif(node -> left != NULL && node -> right != NULL) {


   }  
   else {

   }                           

}

我很难理解逻辑,例如我知道所有这些我需要能够找到被删除节点的父节点,这是我无能为力和任何帮助的地方非常感谢!

5 个答案:

答案 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)

删除节点时,
  - 如果它是一片叶子,你就完成了。
  - 如果有一个孩子,请提升孩子,然后从子树中删除孩子(通过自己打电话)   - 如果它有两个孩子,请选择要推广的孩子,然后从子树中删除该孩子(通过自己打电话)。

有时你挑选的两个孩子中的哪一个取决于像 - 子树的根是子树中所有节点中最少的 - 子树的根是子树中所有节点中的大部分 - 必须保留一些着色或其他副作用

这应该会让你偏离高中心。