我有一个二进制搜索类,我想编写一个删除特殊节点的功能,但我不知道如何。 基本课程是:
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 );
};
答案 0 :(得分:0)
从二叉搜索树中删除节点有3个部分:
在您的特定代码示例中,我说要查找节点应该是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
我刚试过上面链接中的删除代码,效果很好。