我有一个Find函数,以便从BST中找到一个元素
private Node Find(ref Node n, int e)
{
if (n == null)
return null;
if (n.Element == e)
return n;
if (e > n.Element)
return Find(ref n.Right, e);
else
return Find(ref n.Left, e);
}
我使用以下代码来获取节点,然后将此节点设置为null。
Node x = bsTree.Find(1);
x = null;
bsTree.Print();
据推测,这个节点应该从Tree中删除,因为它被设置为null但它仍然存在于树中。
我以前做过这个,但这次错过了什么,不知道是什么。
答案 0 :(得分:3)
您正在初始化变量x
以引用调用Find的结果,然后您将同一变量重新分配给null
。你没有对树做任何事情。
要实际删除该项,您必须编写一些操作树本身的代码。在不知道你拥有什么样的树(红黑,AVL等)的情况下,很难猜出代码应该是什么样的。
答案 1 :(得分:2)
你必须以某种方式得到你想要删除的父节点。 然后,如果要删除的节点是您要执行的左侧节点
parent.Left = null
如果它是正确的:
parent.Right = null
使用此方法,您必须知道您将从树中删除节点以及其所有后代
答案 2 :(得分:1)
编辑:
此代码从树中删除节点,但不返回该节点:
private void Remove(Node n, int e)
{
if (n == null)
return;
if (e > n.Element) {
if (e == n.Right.Element)
n.Right = null;
else
Remove(n.Right, e);
} else {
if (e == n.Left.Element)
n.Left = null;
else
Remove(n.Left, e);
}
}
此代码还返回节点:
private Node Remove(Node n, int e)
{
if (n == null)
return null;
if (e > n.Element) {
if (e == n.Right.Element) {
Node res = n.Right;
n.Right = null;
return res;
} else
return Remove(n.Right, e);
} else {
if (e == n.Left.Element) {
Node res = n.Left;
n.Left = null;
return res;
} else
return Remove(n.Left, e);
}
}
原始代码有什么问题:
想象一下,bsTree指向以下树:
5
1 7
我们现在将节点命名为a
,b
和c
,因此它们分别包含值5,1和7,例如
a
b c
a.Left
现在指向b
和a.Right
指向c
。
我们现在想要删除包含1的节点,即节点b
。为此,我们必须更改树,以使a.Left
为null
,树将如下所示:
5
7
现在我们逐步完成原始代码。第一:
Node x = bsTree.Find(1);
x
已声明,现在指向节点b
。树没有改变。
x = null;
x
现在设置为null,但a.Left
仍指向b
。树仍未改变。
bsTree.Print();
我们现在打印了这棵树。
答案 3 :(得分:1)
从树中删除节点有点困难。我曾经从二叉搜索树中删除了代码。代码在C中,但它清楚地表达了这个想法。
void delete_tree(node ** root,int val) {
node *del = search_tree(root, val);
node *suc;
if (del == NULL) {
printf("The value does NOT exist\n");
return;
}
if (del->left == NULL || del->right == NULL) {
bst_replace(root, del);
return;
}
suc = del->right;
while (suc->left != NULL)
suc = suc->left;
del->val = suc->val;
bst_replace(root, suc);
return;
}
void bst_replace(node ** root,node * del) {
node *child;
if (del->left == NULL)
child = del->right;
else
child = del->left;
if (*root == del)
if (child != NULL) {
child->sup = NULL;
*root = child;
return;
}
else {
free(del);
*root = NULL;
return;
}
if (del->sup->left == del)
del->sup->left = child;
else
del->sup->right = child;
if (child != NULL)
child->sup = del->sup;
free(del);
return;
}
node * search_tree(node ** root,int val) {
node *temp = *root;
while (temp != NULL)
if (val < temp->val)
temp = temp->left;
else if (val > temp->val)
temp = temp->right;
else return temp;
return NULL;
}