在bst树中删除

时间:2017-01-27 08:35:02

标签: c++ binary-search-tree

我有一个二进制搜索类,我想编写一个删除特殊节点的功能,但我不知道如何。 基本课程是:

class Node {
    friend class Tree;
private:
    long long rep;
    Node *left, *right;
    string data;
public:
    Node( string d )
        : data( d ), left( NULL ), right( NULL ), rep( 1 ) {}
};

class Tree {
private:
    Node *root;
public:
    void delete_node( Node *cur , string s );
    void delete_node_helper( string s );
};

2 个答案:

答案 0 :(得分:0)

从二叉搜索树中删除节点有3个部分:

  1. 找到要删除的节点。
  2. 删除节点(可用内存等)。
  3. 合并已删除节点的子项。
  4. 在您的特定代码示例中,我说要查找节点应该是void delete_node_helper(string s);的责任,删除节点应该是void delete_node(Node *cur, string s);的责任,并且合并子节点应该是新创建的功能的责任。

    鉴于前两部分的算法非常简单,让我详细解释第三部分。

    要合并两个BST(其中我们知道哪一个是哪一个,哪一个是正确的),我们应该决定谁将是谁,并在必要时执行递归合并。代码如下所示:

    Node* merge(Node* left, Node* right) {
        if (left == nullptr) {
            return right;
        }
        if (right == nullptr) {
            return left;
        }
        if (rand() & 1) {                              // <- chose parent
            left->right = merge(left->right, right);
            return left;
        }
        right->left = merge(left, right->left);
        return right;
    }
    

    在标记的行上,我们实际上决定哪个节点将是其父节点。在该特定示例中,结果是随机的,但是可以实现任何其他策略。例如,您可以在树的所有节点中存储高度(或大小),并使较大树根的较小树根子项。

答案 1 :(得分:0)

Delete a special node from a BST tree

我刚试过上面链接中的删除代码,效果很好。