450.删除二叉搜索树中的节点
思路
对于普通情况下的节点删除便于理解,但对于存在子树的节点不太能理解。
根据题解,将要删除的节点进行分类,分成4类(没找到除外),关于是否存在子树及左右情况
。最后一种情况,即左右子树均存在,解决办法是找到右子树最左节点,将左子树挂在这个节点上。
代码整体使用递归方法时,一开始在想怎么达到删除操作的目的,递归的返回值应该是什么。题解直接将返回值赋值给root的左右子树,以此来达到删除的操作。
这种最后要返还整棵树的题目递归解法,返回值设定大都参考此类(同前一道题目701插入操作)。
代码
public TreeNode deleteNode(TreeNode root, int key) {
if (root==null) return root;
//第一种情况,如果没遍历到,直接返回,不做考虑
//如果遍历到了
if (root.val==key) {
if (root.left==null && root.right==null){
return null; //直接返回null
}else if (root.left==null){
return root.right;
}else if (root.right==null){
return root.left;
}else {//左右都不为空
TreeNode node=root.right;
while (node.left!=null){//遍历找到右子树最左的节点
node=node.left;
}
node.left=root.left;
root=root.right;
return root;
}
}else if (root.val>key){
root.left=deleteNode(root.left,key);
}else root.right=deleteNode(root.right,key);
return root;
}