public bool Delete(T value) { //Проверяем, существует ли данный узел BinaryTree <T> tree = Search(value); if (tree == null) { return(false); //Если узла не существует, вернем false } BinaryTree <T> currentNode; //Если удаляем корень if (tree == this) { if (tree.right != null) { currentNode = tree.right; } else { currentNode = tree.left; } while (currentNode.left != null) { currentNode = currentNode.left; } T temp = currentNode.value; this.Delete(temp); tree.value = temp; return(true); } //Удаление листьев if (tree.left == null && tree.right == null && tree.root != null) { if (tree == tree.root.left) { tree.root.left = null; } else { tree.root.right = null; } return(true); } //Удаление узла, имеющего левое поддерево, но не имеющее правого поддерева if (tree.left != null && tree.right == null) { //Меняем родителя tree.left.root = tree.root; if (tree == tree.root.left) { tree.root.left = tree.left; } else if (tree == tree.root.right) { tree.root.right = tree.left; } return(true); } //Удаление узла, имеющего правое поддерево, но не имеющее левого поддерева if (tree.left == null && tree.right != null) { //Меняем родителя tree.right.root = tree.root; if (tree == tree.root.left) { tree.root.left = tree.right; } else { tree.root.right = tree.right; } return(true); } //Удаляем узел, имеющий поддеревья с обеих сторон if (tree.right != null && tree.left != null) { currentNode = tree.right; while (currentNode.left != null) { currentNode = currentNode.left; } //Если самый левый элемент является первым потомком if (currentNode.root == tree) { currentNode.left = tree.left; tree.left.root = currentNode; currentNode.root = tree.root; if (tree == tree.root.left) { tree.root.left = currentNode; } else { tree.root.right = currentNode; } return(true); } //Если самый левый элемент НЕ является первым потомком else { if (currentNode.right != null) { currentNode.right.root = currentNode.root; } currentNode.root.left = currentNode.right; currentNode.right = tree.right; currentNode.left = tree.left; tree.left.root = currentNode; tree.right.root = currentNode; currentNode.root = tree.root; if (tree == tree.root.left) { tree.root.left = currentNode; } else { tree.root.right = currentNode; } return(true); } } return(false); }
public BinaryTree(T value, BinaryTree <T> root) { this.value = value; this.root = root; }