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