如何删除我的二进制搜索树中的节点

时间:2019-04-01 19:49:05

标签: c# algorithm binary-search-tree

我已经创建了一个二叉搜索树,并且坚持如何从我的树中删除节点。我的代码当前如下所示:

public class Node
{

    public int value;
    public int id;
    public Node left, right;

    public Node(int identifier, int v)
    {
        id = identifier;
        value = v;
        left = right = null;
    }
}

public class BinaryTree
{

    public static Node head;

    public virtual Node insert(Node node,int id, int value)
    {

        if (node == null)
        {
            return (new Node(id, value));
        }
        else
        {
            if (value <= node.value)
            {
                node.left = insert(node.left, id, value);
            }
            else
            {
                node.right = insert(node.right, id, value);
            }
            return node;
        }
    }

    public virtual int maxvalue(Node node)
    {
        Node current = node;

        while (current.right != null)
        {
            current = current.right;
        }
        return (current.id);
    }

    public static void Main(string[] args)
    {

        BinaryTree bt = new BinaryTree();

        Node root = null;
        root = bt.insert(root, 4, 5);
        root = bt.insert(root, 9, 6);
        root = bt.insert(root, 16, 3);
        Console.WriteLine(bt.maxvalue(root));
        root = bt.insert(root, 12, 8);
        Console.WriteLine(bt.maxvalue(root));
        Console.WriteLine(bt.maxvalue(root));
    }
}

我想要做的是,每当我打印出具有最高值的节点的ID时,我都希望从BST中删除该节点。但是,我不知道如何实现此功能,因此,如果有人知道如何,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

仅在您关心的唯一操作是insertremove max(称为优先级队列)的情况下,您可能会对考虑使用max-heap感兴趣(请参阅{{3 }})的数据结构。

this link

在某些情况下,如Aleks所建议的那样,可以使用OrderedDictionary,但是它不允许重复的密钥,因此您将需要很多摆弄才能使其适应您的问题。