【问题标题】:C++ remove node binary search treeC ++删除节点二叉搜索树
【发布时间】:2010-10-20 23:35:47
【问题描述】:

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

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

我很难理解逻辑,例如,我知道所有这些我都需要能够找到被删除节点的父节点,这是我一无所知和任何帮助的地方将不胜感激!

【问题讨论】:

  • 这是作业吗?如果是,则需要一个作业标签。

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


【解决方案1】:

这听起来像是家庭作业。您可能会找到this article on binary tree rotation to be helpful。除了给您一些关于如何处理一些有趣案例的提示外,该文章还将向您展示如何自己解决问题。

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

【讨论】:

  • 嗯,这是一个比我更好的答案。我想它需要各种各样的;)
【解决方案2】:

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

有了这个改变,你应该更容易弄清楚其余的部分。但是如何调用该函数变得很重要。

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

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

【讨论】:

    【解决方案3】:

    二叉搜索树上的This wiki page 可能会有所帮助。

    【讨论】:

      【解决方案4】:

      除了其他答案(假设这是家庭作业,重点是学习),您可能会发现 Niklaus Wirth 的 "Algorithms + Data Structures = Programs" 非常有启发性,无论是一般情况还是针对您的特定问题。

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

      希望在您最近的(大学?)图书馆有吗?

      干杯,

      【讨论】:

        【解决方案5】:

        当你删除一个节点时,
        - 如果是一片叶子,你就完成了。
        - 如果它有一个孩子,提升孩子,然后从其子树中删除孩子(通过调用你自己)。
        - 如果它有两个孩子,选择哪一个来提升,然后从它的子树中删除那个孩子(通过调用你自己)。

        有时您选择两个孩子中的哪一个取决于以下因素:
        - 子树的根是子树中所有节点中最小的
        - 子树的根是子树中所有节点中最多的
        - 必须保留一些着色或其他附带条件

        这应该会让你远离中心位置。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多