繁体   English   中英

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

[英]C++ remove node binary search tree

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


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


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


   }  
   else {

   }                           

}

我很难理解逻辑,例如,我知道对于所有逻辑我都需要能够找到要删除的节点的父节点,这对我来说是毫无头绪的,任何帮助都会很大感谢!

这听起来像作业。 您可能会发现有关二叉树旋转的本文很有帮助 除了为您提供一些有关如何处理一些有趣案例的提示外,该文章还将向您展示如何自行解决问题。

从树中删除是一个有趣的情况,我记得在80年代末用C编写自己的AVL树实现时对此感到困惑。

首先,您的函数也应该为父级添加一个参数(除非您的树有指向父级的指针,听起来好像没有)。

有了这一更改,您应该更容易理解其余的内容。 但是如何调用该函数就变得很重要。

注意 :我假设这是家庭作业,所以我不想提供全面的答案。

另外,关于删除节点后如何处理节点(如何重新链接它们)的逻辑,请尝试绘制一些图。

二进制搜索树上的此Wiki页面可能会有所帮助。

除了其他答案(并假设这是家庭作业,要学习的重点)之外,您可能会发现Niklaus Wirth的“算法+数据结构=程序”很有启发性,无论是针对一般问题还是针对您的特定问题。

这是一本经典的小书,一本宝石。

希望可以在离您最近的(大学吗?)图书馆使用?

干杯,……

删除节点时,
-如果是一片叶子,就完成了。
-如果有一个孩子,则将其升级,然后从其子树中删除该孩子(通过称呼自己)。
-如果有两个孩子,请选择要升级的孩子,然后从其子树中删除该孩子(称呼自己)。

有时候,您选择两个孩子中的哪个取决于以下因素
-子树的根是该子树中所有节点中最少的一个
-子树的根是该子树中所有节点中最多的
-必须保留一些颜色或其他副作用

这应该使您脱颖而出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM