前言:在二叉搜索树中,对于每个结点,它的所有左子树结点的元素小于当前节点数据,所有右子树结点大于当前结点。
二叉搜索树的三种常见操作:查找、删除、插入。
查找
在查找操作中,就可以看到二叉搜索树的优势,它的时间复杂度为O(lg n).
//查找
public TreeNode find(TreeNode root,int data){
if(root == null) return null;
if(root.val>data) return find(root.left,data);
if(root.val<data) return find(root.right,data);
return root;
}
//查找最小值
public TreeNode findMin(TreeNode root){
if(root == null) return null;
if(root.left==null) return root;
return findMax(root.left);
}
//查找最大值
public TreeNode findMax(TreeNode root) {
if(root==null) return null;
if(root.right==null) return root;
return findMax(root.right);
}
插入:
思路:首先找到要插入数据的位置,与查找类似。当找到这个位置后,如果数据已经存在,则直接返回即可,否则,将数据插入到走过的最后一个位置上。
public TreeNode insert(TreeNode root,int data){
if(root == null) {
root = new TreeMode(data);
root.left = null;
root.right = null;
}
if(root.val>data) root.left = insert(root.left,data);
if(root.val<data) root.right = insert(root.right,data);
return root;
}
删除: leetcode第450题 Delete Node in a BST
思路:首先找到这个结点,然后删除这个结点即可。删除的过程中听注意:如果该节点的为叶子结点,直接删除结点;如果只有一个孩子结点,就用这个结点替代即可;如果该节点有两个结点,可以有两种做法:1,用左子树中最大的结点替换该节点,并在左子树中删除该最大节点。2、用右子树中最小的结点替换该节点,并在右子树中删除该最小节点。
java代码实现
class Solution {
//考虑四种情况
public TreeNode deleteNode(TreeNode root, int key) {
if(root ==null) return null;
if(root.val>key){
root.left = deleteNode(root.left, key);
}else if(root.val<key){
root.right = deleteNode(root.right,key);
}else{
if(root.left!=null&&root.right!=null){
TreeNode t = findMax(root.left);
root.val = t.val;
root.left = deleteNode(root.left,t.val);
}else{
if(root.left==null)
root = root.right;
else
root = root.left;
}
}
return root;
}
public TreeNode findMax(TreeNode root) {
if(root==null) return null;
if(root.right==null) return root;
return findMax(root.right);
}
}
判断:leetcode第98题 Validate Binary Search Tree
思路:只要保证当前节点的左子树中的最大值小于当前节点,右子树中的最小值大于当前节点的值。遍历整个树中的结点即可。这里我们会犯得的一个错误是,仅判断当前结点的左孩子结点小于当前结点,右孩子结点大于当前结点是不够的。原因就在于左子树中可能存在比当前结点大的值。右子树存在比当前结点小的值。
JAVA代码实现
class Solution {
public boolean isValidBST(TreeNode root) {
if(root ==null) return true;
if(root.left!=null&&findMax(root.left).val >=root.val) return false;
if(root.right!=null&&findMin(root.right).val<=root.val) return false;
return isValidBST(root.left)&&isValidBST(root.right);
}
public TreeNode findMax(TreeNode root){
if(root == null) return null;
if(root.right==null) return root;
return findMax(root.right);
}
public TreeNode findMin(TreeNode root){
if(root == null) return null;
if(root.left==null) return root;
return findMax(root.left);
}
}