题目描述
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点; 如果找到了,删除它。 说明: 要求算法时间复杂度为 O(h),h 为树的高度。
解答
分析
模板
主方法
return delete(root,target)
递归方法
TreeNode delete(TreeNode root,int target){
if(root == null) return null;
if(当前节点值 < target) 去root.right 找
if(当前节点值 > target) 去root.left 找
if(当前节点值 == target){
前三种情况省略
...
TreeNode temp = 右子节点;
while(右子树左边接不为null){ temp一直左移 }
root.val = temp.val;
root.right = delete (root.right,旧位置的值);
}
}
代码
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
root = delete(root,key);
return root;
}
private TreeNode delete(TreeNode root, int key) {
if (root == null) return null;
if (root.val > key) {
root.left = delete(root.left,key);
} else if (root.val < key) {
root.right = delete(root.right,key);
} else {
if (root.left == null) return root.right;
if (root.right == null) return root.left;
TreeNode tmp = root.right;
while (tmp.left != null) {
tmp = tmp.left;
}
root.val = tmp.val;
root.right = delete(root.right,tmp.val);
}
return root;
}
}
|