1.删除二叉树中的节点
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
TreeNode res = null;
if(root != null){
int rootval = root.val;
if(val == rootval){
res = root;
}else if(val < rootval){
res = searchBST(root.left, val);
}else{
res = searchBST(root.right, val);
}
}
return res;
}
public TreeNode findlargest(TreeNode root){
if(root.right != null){
root = findlargest(root.right);
}
return root;
}
public TreeNode removelargest(TreeNode root){
if(root.right != null){
TreeNode rightchild = root.right;
TreeNode rootnode = removelargest(rightchild);
root.right = rootnode;
}
else{
root = root.right;
}
return root;
}
public TreeNode deleteNode(TreeNode root, int key) {
//找到要删除的节点
TreeNode rootnode = searchBST(root,key);
//two children
if(rootnode.left!=null && rootnode.right!=null){
//寻找左子树中值最大的节点
TreeNode rootleft = root.left;
TreeNode largestnode = findlargest(rootleft);
//替换根节点的值
rootnode.val = key;
//删除左子树中值最大的节点
rootnode.left = removelargest(rootleft);
}
//one child
else if(rootnode.left == null){
rootnode = rootnode.right;
}
else{
rootnode = rootnode.left;//包括了没有孩子的情况
}
return rootnode;
}
}