public void delete(T val) { Node <T> node = findNode(root, val); if (node == null) { return; } else if (node.isLeaf()) { if (node == root) { root = null; } else if (node.Parent.Right == node) { node.Parent.Right = null; } else { node.Parent.Left = null; } } else if (node.hasOneChild()) { if (node == root) { if (node.Left != null) { root = node.Left; } else { root = node.Right; } root.Parent = null; } else if (node.Parent.Left == node) { if (node.Left != null) { node.Parent.Left = node.Left; node.Left.Parent = node.Parent; } else { node.Parent.Left = node.Right; node.Right.Parent = node.Parent; } } else { if (node.Left != null) { node.Parent.Right = node.Left; node.Left.Parent = node.Parent; } else { node.Parent.Right = node.Right; node.Right.Parent = node.Parent; } } } else if (node.hasTwoChild()) { //TODO } }
public void delete(T val) { Node<T> node = findNode(root, val); if (node == null) return; else if (node.isLeaf()) { if (node == root) root = null; else if (node.Parent.Right == node) node.Parent.Right = null; else node.Parent.Left = null; } else if (node.hasOneChild()) { if (node == root) { if (node.Left != null) { root = node.Left; } else { root = node.Right; } root.Parent = null; } else if (node.Parent.Left == node) { if (node.Left != null) { node.Parent.Left = node.Left; node.Left.Parent = node.Parent; } else { node.Parent.Left = node.Right; node.Right.Parent = node.Parent; } } else { if (node.Left != null) { node.Parent.Right = node.Left; node.Left.Parent = node.Parent; } else { node.Parent.Right = node.Right; node.Right.Parent = node.Parent; } } } else if (node.hasTwoChild()) { Node<T> successor = node.Right; while (successor.Left != null) successor = successor.Left; delete(successor.val); successor.Right = node.Right; successor.Left = node.Left; if (node.Left != null) node.Left.Parent = successor; if (node.Right != null) node.Right.Parent = successor; successor.Parent = node.Parent; if (node == root) root = successor; else if (node.Parent.Right == node) node.Parent.Right = successor; else if(node.Parent.Left==node) node.Parent.Left = successor; } }