题目:
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
思路:
情况一:没有找到值为key的节点,遇到空节点,直接返回root
情况二:要删除的节点是叶子节点,直接删除,返回null
情况三:要删除的节点只有左孩子,左孩子成为根节点,返回root.left
情况四:要删除的节点只有右孩子,右孩子成为根节点,返回root.right
情况五:要删除的节点有左孩子和右孩子,将左孩子移动到右孩子的最左节点的左孩子(代码解法),或者将右孩子移动到左孩子的最右节点的右孩子
代码:
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;
//要删除的节点只有左孩子,返回左孩子为根的子树
else if(root.left!=null&&root.right==null) return root.left;
//要删除的节点只有右孩子,返回右孩子为根的子树
else if(root.left==null&&root.right!=null) return root.right;
//要删除的节点有左孩子和右孩子,把左孩子放到右孩子最左节点的左孩子上
else{
TreeNode cur=root.right;//找到右孩子最左的节点
while(cur.left!=null)
cur=cur.left;
cur.left=root.left;//把左孩子放到右孩子最左节点的左孩子上
return root.right;//返回删除节点的右子树
}
}
if(root.val>key) root.left=deleteNode(root.left,key);
if(root.val<key) root.right=deleteNode(root.right,key);
return root;
}