If the root is the one to be deleted

1) root is leave --> return null

2) root has right --> move root.left to the left of the most left child of root.right, then return root.right

3) root only has left --> return left

If the root is not to be deleted --> recursively find it in either left or right branch

```
public class Solution {
public TreeNode MostLeft(TreeNode root) {
if (root.left != null) return MostLeft(root.left);
return root;
}
public TreeNode DeleteNode(TreeNode root, int key) {
if (root == null) return null;
if (root.val == key) {
if (root.left == null && root.right == null) {
return null;
} else if (root.right != null) {
MostLeft(root.right).left = root.left;
return root.right;
} else return root.left;
}
if (key < root.val) root.left = DeleteNode(root.left, key);
else root.right = DeleteNode(root.right, key);
return root;
}
}````
```