leetcode 450. 删除二叉搜索树中的节点
/**
* 删除结点分为两种情况:叶子结点、非叶子结点
* 如果是叶子结点则直接删除,如果是非叶子结点则分为三种情况:
* 情况一:左右子都存在:则找右子树最小的元素、或者左子树最大的元素代替当前元素即可
* 情况二:只有左子树存在:直接返回右子树
* 情况三:只有右子树存在:直接返回左子树。
*
* @param root
* @param key
* @return
*/
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null) {
return null;
}
// 向左查找
if (root.val > key) {
root.left = deleteNode(root.left, key);
return root;
}
// 向右查找
if (root.val < key) {
root.right = deleteNode(root.right, key);
return root;
}
// 如果左子树为空,则直接返回右子树
if (root.left == null) {
return root.right;
}
// 如果右子树为空,则直接返回左子树
if (root.right == null) {
return root.left;
}
// 否则查找左子树的最大节点代替当前节点
TreeNode max = max(root.left);
// 需要复制max节点,如果不复制max节点,则需要取消max的parent对max的指向,
TreeNode newNode = new TreeNode(max.val);
// 新节点的left是删除左子树中最大节点后的左子树
newNode.left = removeMax(root.left);
// 右子树为删除节点的右子树
newNode.right = root.right;
// 释放root的指向
root.left = null;
root.right = null;
// 返回新节点,是父节点右root改为指向newNode
return newNode;
}
public TreeNode max(TreeNode treeNode) {
TreeNode temp = treeNode;
while (temp.right != null) {
temp = temp.right;
}
return temp;
}
public TreeNode removeMax(TreeNode treeNode) {
// 如果right为null,则当前节点就是最大节点,则返回右子树
if (treeNode.right == null) {
return treeNode.left;
}
treeNode.right = removeMax(treeNode.right);
return treeNode;
}