模板题目链接
- BST查找 - Leetcode 270. Closest BST Value
- BST插入 - Leetcode 701. Insert Node in BST
- BST删除 - Leetcode 450. Delete Node in BST
二叉搜索树-BST 概述
BST是二叉树的一种,具备二叉树的结构性质:只有一个Root节点,每一个节点最多可以有左右两个子节点。BST自身的性质:每一个节点的左儿子数值一定比他小,右儿子的数值一定比他大。这个性质也使得BST的中序遍历输出结果是一个严格递增序列。严格意义上,BST中不保存数值相同的元素,如果有重复元素可以在每一个节点加入count属性来进行计数。
BST基本问询模板
- 查找一个元素
代码如下:
class Solution {
double min = Double.MAX_VALUE;
int res = -1;
public int closestValue(TreeNode root, double target) {
search(root, target);
return res;
}
private void search(TreeNode root, double target) {
// > target的第一个数
if(root==null) return;
if(Math.abs(root.val-target)<min) {
min = Math.abs(root.val-target);
res = root.val;
}
if(root.val>target) search(root.left, target);
search(root.right, target);
}
}
时间复杂度:, 如果BST结构较为平衡(最大高度差<=1)也就是平衡BST的情况下,最坏的情况是有可能BST结构非常不平衡,也就是所有节点形成类似链表结构,这时时间会是
;空间复杂度:
也就是递归深度。
- BST插入节点
代码如下:
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
TreeNode res = insert(root, val);
return res;
}
private TreeNode insert(TreeNode root, int val){
// 分治
if(root==null) return new TreeNode(val);
if(root.val<val) root.right = insert(root.right, val);
else if(root.val>val) root.left = insert(root.left, val);
return root;
}
}
- 删除节点
代码如下:
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
TreeNode res = delete(root, key);
return res;
}
private TreeNode delete(TreeNode root, int key) {
if(root==null) return null;
if(root.val<key) root.right = delete(root.right, key);
else if(root.val>key) root.left = delete(root.left, key);
else {
// if root is leaf, directly remove
if(root.left==null && root.right==null) {
return null;
} else if(root.left!=null && root.right!=null) {
// find predecessor or successor to replace remove node
// predecessor - 左边的最大值
TreeNode left = root.left;
if(left.right==null) {
// no right node current node is predecessor
root.val = left.val;
root.left = left.left;
} else {
// 向右找到最右也就是最大节点以及最大节点的parent
// 这里使用快慢针来找到对应位置
TreeNode fast = left.right;
TreeNode slow = left;
while(fast.right!=null) {
fast = fast.right;
slow = slow.right;
}
// fast 找到最右边,slow是上一个节点
root.val = fast.val;
slow.right = fast.left; // remove predecessor
}
return root;
} else {
// one side is not leaf
if(root.left!=null) return root.left;
if(root.right!=null) return root.right;
}
}
return root;
}
}
时间复杂度:如果是平衡BST那么就是,最坏情况:
;空间复杂度:
即递归深度。