从树中删除对象

时间:2010-04-02 11:40:53

标签: c# binary-tree

我有一个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但它仍然存在于树中。

我以前做过这个,但这次错过了什么,不知道是什么。

4 个答案:

答案 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

我们现在将节点命名为abc,因此它们分别包含值5,1和7,例如

   a

b     c

a.Left现在指向ba.Right指向c

我们现在想要删除包含1的节点,即节点b。为此,我们必须更改树,以使a.Leftnull,树将如下所示:

   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;

}