二叉搜索树———二叉搜索树的删除操作
我们把二叉搜索树的删除分为三种情况
第一种:没有孩子节点直接删除
如图删除 7,4,2直接删除接可以
第二种:只有一个孩子节点把孩子节点拉上去即可
如图:删除6把7拉上去
第三种:两个节点都不为空这个时候我们需要找到其右子树的最小节点返回并且要删除最小节点并且把其右子树返回给它
如图:删除3 4没有左孩子直接返回4 所以最后的结果只是4覆盖3
在代码里我们将第二种情况分为两种左子树为空和右子树为空里面包含了两个孩子都为空的情况(我们这里考虑高度不必原来大的方法)
上代码:
*/
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null) {
return null;
}
if (key < root.val) {
// 待删除节点在左子树中
root.left = deleteNode(root.left, key);
return root;
} else if (key > root.val) {
// 待删除节点在右子树中
root.right = deleteNode(root.right, key);
return root;
} else {
// key == root.val,root 为待删除节点
if (root.left == null) {
// 返回右子树作为新的根
return root.right;
} else if (root.right == null) {
// 返回左子树作为新的根
return root.left;
} else {
// 左右子树都存在,返回后继节点(右子树最左叶子)作为新的根
TreeNode successor = min(root.right);
successor.right = deleteMin(root.right);
successor.left = root.left;
return successor;
}
}
}
//返回右子树最小节点
private TreeNode min(TreeNode node) {
if (node.left == null) {
return node;
}
return min(node.left);
}
//返回右子树最小节点的右孩子
private TreeNode deleteMin(TreeNode node) {
if (node.left == null) {
return node.right;
}
node.left = deleteMin(node.left);
return node;
}
}