删除C#树中的节点

时间:2015-05-09 08:38:18

标签: c# pointers tree

我想知道是否有人可以帮助我。

我想删除C#树中的节点,下面的代码完美地完成了。但我不能完全理解的是,在遍历和删除过程中声明的所有节点都只是实际节点的副本,我无法看到它们如何影响实际节点并交换它们彼此。我在C ++中使用这种方法没有问题,因为我使用指针和两个指针可以同时指向一块内存但是我们不能在C#中执行它。

class BinarySearchTree<T>
{
    class Node
    {
        public Node Left;
        public T Info;
        public Node Right;
    }
    public bool DeleteItem(T item)
    {
        Node t = Root, s = null;
        while (t != null && Compare(item, t.Info) != 0)
        {
            s = t;
            t = (Compare(item, t.Info) <= 0) ? t.Left : t.Right;
        }

        if (t == null)
            return false;

        if (t.Left != null && t.Right != null) //node has 2 children
        {
            Node suc = t.Right, parent_suc = null;
            while (suc.Left != null)
            {
                parent_suc = suc;
                suc = suc.Left;
            }
            if (parent_suc == null)
                t.Right = suc.Right;
            else
                parent_suc.Left = suc.Right;
            t.Info = suc.Info;
        }
        else //node has either one child or no child at all
        {
            Node child = t.Left;
            if (t.Right != null)
                child = t.Right;
            if (s == null)
                Root = child;
            else
            {
                if (s.Left == t)
                    s.Left = child;
                else
                    s.Right = child;
            }
        }
        return true;
    }
}

1 个答案:

答案 0 :(得分:3)

您的Node类型是,这是引用类型。这意味着当您将其分配或复制到新变量时,它将为原始数据创建一个新的引用,而不是复制数据本身(相反的是值类型)。它确实与C ++指针非常相似,但存在一些差异(没有指针算术,但有自动垃圾收集)。

请参阅this MSDN关于C#类型的文章,以及this关于C ++指针和C#引用的文章。