无法从BST删除节点-C#

时间:2018-08-21 21:55:07

标签: c# .net data-structures binary-search-tree

我正在学习数据结构,最近我一直在尝试创建BST。这是该代码:

class Program
{
    static void Main(string[] args)
    {
        BST tree = new BST();
        tree.Insert(3);
        tree.Insert(6);
        tree.Insert(12);
        tree.Insert(2);
        tree.Insert(8);

        tree.InOrder(tree.root);
        // output: 2 3 6 8 12

        tree.Delete(12);

        tree.InOrder(tree.root);
        // output: 2 3 6   
    }
}

class Node 
{
    public Node lc;
    public int value;
    public Node rc;
}

class BST 
{
    public Node root;

    public BST() 
    {
        root = null;
    }

    public void Insert(int value) 
    {
        Node temp = new Node();
        temp.value = value;

        if (root == null)
        {
            root = temp;
        }
        else 
        {
            Node parent = null;
            Node current = root;

            while (current != null) 
            {
                parent = current;

                if (value <= current.value)
                {
                    current = current.lc;
                }
                else 
                {
                    current = current.rc;
                }
            }

            if (value <= parent.value)
            {
                parent.lc = temp;
            }
            else 
            {
                parent.rc = temp;
            }
        }
    }

    public void Delete(int value) 
    {
        Node current = root;
        Node parent = null;

        while (current != null) 
        {
            parent = current;

            if (value <= current.value)
            {
                current = current.lc;

                if (current.value == value) 
                {
                    parent.lc = null;
                    break;
                }
            }
            else 
            {
                current = current.rc;

                if (value == current.value)
                {
                    parent.rc = null;
                    break;
                }
            }
        }
    }

    public void InOrder(Node root) 
    {
        if (root != null) 
        {
            InOrder(root.lc);
            Console.WriteLine(root.value);
            InOrder(root.rc);
        }   
    }
}

但是,我在删除标识的Node时遇到问题,截至目前,我正在编写用于删除没有任何子节点的代码。

由于某些原因,当我尝试删除拥有值12的Node时,也删除了值为8的Node ....我尝试空运行,但仍然不明白为什么我失去连接与另一个拥有8的节点。

1 个答案:

答案 0 :(得分:0)

好吧,结果如Sasha所指出的那样,我错误地绘制了树,并失去了与保持值为8的Node的连接,因为它已连接至已删除的Node的左侧。