BSTNode <T> Root; // корень дерева, или null public BST(BSTNode <T> node) { Root = node; }
public BSTFind() { Node = null; }
public void GenerateTree() { Root = AddNode(null, 0); // создаём дерево с нуля из массива BSTArray }
public bool DeleteNodeByKey(int key) { // удаляем узел по ключу BSTFind <T> foundNode = FindNodeByKey(key); if (foundNode.NodeHasKey) { // удаляемый узел не имеет потомков if (foundNode.Node.LeftChild == null && foundNode.Node.RightChild == null) { if (foundNode.Node.Parent.LeftChild != null && foundNode.Node.Parent.LeftChild.Equals(foundNode.Node)) { foundNode.Node.Parent.LeftChild = null; } else if (foundNode.Node.Parent.RightChild != null && foundNode.Node.Parent.RightChild.Equals(foundNode.Node)) { foundNode.Node.Parent.RightChild = null; } } // удаляемый узел имеет только одного потомка else if (foundNode.Node.LeftChild == null ^ foundNode.Node.RightChild == null) { if (foundNode.Node.LeftChild != null) // левый потомок привязываем к родителю удаленного узла { if (foundNode.Node.Parent.LeftChild != null && foundNode.Node.Parent.LeftChild.Equals(foundNode.Node)) { foundNode.Node.Parent.LeftChild = foundNode.Node.LeftChild; } else { foundNode.Node.Parent.RightChild = foundNode.Node.LeftChild; } foundNode.Node.LeftChild.Parent = foundNode.Node.Parent; } else // правый потомок привязываем к родителю удаленного узла { if (foundNode.Node.Parent.LeftChild != null && foundNode.Node.Parent.LeftChild.Equals(foundNode.Node)) { foundNode.Node.Parent.LeftChild = foundNode.Node.RightChild; } else { foundNode.Node.Parent.RightChild = foundNode.Node.RightChild; } foundNode.Node.RightChild.Parent = foundNode.Node.Parent; } } // удаляемый узел имеет двух потомков else { BSTNode <T> successorNode = FinMinMax(foundNode.Node.RightChild, false); // наименьший потомок, который больше удаляемого узла if (successorNode.RightChild != null) // если наименьший потомок не является листом { successorNode.Parent.LeftChild = successorNode.RightChild; // передаем его правого потомка левым узлом родителю successorNode.RightChild.Parent = successorNode.Parent; // правому потомку назначаем родителя } else { if (successorNode.Parent.LeftChild == successorNode) { successorNode.Parent.LeftChild = null; // удаляем левый лист } else { successorNode.Parent.RightChild = null; // удаляем правый лист } } // преемник замещает удаленный узел if (foundNode.Node.Parent.RightChild == foundNode.Node) { foundNode.Node.Parent.RightChild = successorNode; } else { foundNode.Node.Parent.LeftChild = successorNode; } successorNode.Parent = foundNode.Node.Parent; // новый родитель для узла-преемника successorNode.LeftChild = foundNode.Node.LeftChild; // левый потомок удаленного узла становится потомком узла-преемника successorNode.RightChild = foundNode.Node.RightChild; // правый потомок удаленного узла становится потомком узла-преемника // связать потомков удаленного узла с новым родителем if (foundNode.Node.RightChild != null) { foundNode.Node.RightChild.Parent = successorNode; } if (foundNode.Node.LeftChild != null) { foundNode.Node.LeftChild.Parent = successorNode; } } return(true); } return(false); // если узел не найден }
public int[] BSTArray; // временный массив для ключей дерева public BalancedBST() { Root = null; }