public TreeNode(int data)
parent = left = right = null;
public void setData(int data)
public void setLeft(TreeNode node)
public void setRight(TreeNode node)
public void setParent(TreeNode node)
public TreeNode getLeft()
public TreeNode getRight()
public TreeNode getParent()
public static void insert(TreeNode node)
if (x.getData() > node.getData())
if (y.getData() > node.getData())
public static void delete(TreeNode node)
if (node.getLeft() == null && node.getRight() == null)
if (node.getParent() != null && node.getParent().getLeft() == node)
else if (node.getParent() != null && node.getParent().getRight() == node)
else if (node.getLeft() == null || node.getRight() == null)
if (node.getParent() != null)
TreeNode x = node.getLeft() == null ? node.getRight() : node.getLeft();
if (node.getParent().getLeft() == node)
node.getParent().setLeft(x);
node.getParent().setRight(x);
TreeNode x = findSuccessor(node);
node.setData(x.getData());
TreeNode nodeChild = x.getLeft() == null ? x.getRight() : x.getLeft();
if (x.getParent().getLeft() == x)
x.getParent().setLeft(nodeChild);
x.getParent().setRight(nodeChild);
if (x.getParent().getLeft() == x)
x.getParent().setLeft(nodeChild);
x.getParent().setRight(nodeChild);
public TreeNode findMinimum(TreeNode root)
if (root.getLeft() != null)
return findMinimum(root.getLeft());
public static TreeNode findMaximum(TreeNode root)
if (root.getRight() != null)
return findMaximum(root.getRight());
public static TreeNode findSuccessor(TreeNode node)
if (node.getRight() != null)
return findMinimum(node.getRight());
TreeNode y = node.getParent();
while (y != null && x == y.getRight())
public static TreeNode findPredecessor(TreeNode node)
if (node.getLeft() != null)
return findMaximum(node.getLeft());
TreeNode y = node.getParent();
while (y != null && x == y.getLeft())
public static void Main()
Console.WriteLine("Hello World");