Как удалить узлы в моем двоичном дереве поиска

#c# #algorithm #binary-search-tree

#c# #алгоритм #двоичное дерево поиска

Вопрос:

Я создал бинарное дерево поиска и застрял на том, как удалить узел из моего дерева. Мой код в настоящее время выглядит следующим образом:

 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));
    }
}
  

Что я хочу сделать, так это каждый раз, когда я распечатываю идентификатор узла с наибольшим значением, я затем хочу удалить этот узел из моего BST. Однако я не знаю, как реализовать эту функцию, поэтому, если кто-нибудь знает как, я был бы признателен.

Комментарии:

1. то, что вы ищете, en.wikipedia.org/wiki/Self-balancing_binary_search_tree

2. Это звучит как домашнее задание. Если это так — Стив уже предоставил хорошую ссылку для начала. Но в случае, если это не так, вы можете использовать OrderedDictionary

3. «я застрял на том, как удалить узел из моего дерева» — каким образом? Что вы пробовали? Что сделал этот код? Чем это отличается от того, что вы хотели, чтобы это делало? Тем не менее, в целом: для начала вы должны просто заставить работать удаление узла (нетривиально для не-конечных узлов в двоичном дереве), а затем просто найти узел с наивысшим значением (тривиальный) и использовать ранее реализованное удаление. Если это предполагается выполнять итеративно, вы можете перейти к совместной оптимизации обхода и удаления, чтобы вам не приходилось перезапускать корневой каталог после каждого удаления.