题目
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
题解
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root == null) return null;
if(root.val == key) {
if(root.left == null) return root.right;
if(root.right == null) return root.left;
//左右子节点都存在
//既可以将右子树直接添加到左子树最右边节点的右边
//也可以将左子树添加到右子树最左边节点的左边
TreeNode tmp = root.left;
while(tmp.right != null) {
tmp = tmp.right;
}
tmp.right = root.right;
return root.left;
}
else if(root.val > key) root.left = deleteNode(root.left, key); //目标值在左子树
else root.right = deleteNode(root.right, key); //目标值在右子树
return root;
}
}