目录
HashMap底层基于哈希表(数组+链表)的实现。
TreeMap底层基于二分搜索平衡树的实现(BeeTree)。
一、二分搜索树
1.1什么是二分搜索树
右基础BST没有结构上的特点,他是一个二叉树,每个结点的值大于其左右左子树的结点值,小于其右子树的结点值,左子树<树根<右子树。
存储的元素必须具备可比较性。
(1)二分搜索树的中序遍历:能得到一个完全升序的数组(有序数组)
(2)在BST查找一个元素是否存在,其实就是一个二分查找,时间复杂度为O(logn)走到空树还没找到,说明该元素不存在。BST在实际的生产工作中有着广泛应用。
1.2创建一个二分搜索树
(1)二分搜索树的内部构建
和正常的二叉树是相通的,创建一个size来记录长度,root作为根节点。
然后TreeNode类中有val表示该节点的值,left表示左子树,right表示右子树。
public class MyBinarySearchTree {
private int size;
private TreeNode root;
private static class TreeNode{
int val;
TreeNode left ;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
}
(2)插入操作
插入之后的新节点一定是叶子结点,不断比较当要插入的值和树根的大小关系,不断走左右子树,如果值比左子树小就走左子树,值比右子树大就走右子树。直到走到null,就构造新节点放入带插入元素的值。
public void add(int val){
root = add(root,val);
}
private TreeNode add(TreeNode root, int val) {
if(root==null){
size++;
return new TreeNode(val);
}
if(val>root.val){
root.right = add(root.right,val);
}
if(val<root.val){
root.left = add(root.left,val);
}
return root;
}
(3)判断一个val值是否存在
判断则创建一个递归,两个终止条件当走到最后root==null,则证明这个二叉搜索树中不包含该val值,则返回false。另一种是当root.val == val,则找到了这个该元素返回true即可。
然后如果值比左子树小就递归左子树,值比右子树大就递归右子树。
public Boolean contains(int val){
return contains(root,val);
}
private Boolean contains(TreeNode root, int val) {
if(root==null){
return false;
}
if(root.val == val){
return true;
}
if(val<root.val){
return contains(root.left,val);
}else{
return contains(root.right,val);
}
}
public static void main(String[] args) {
MyBinarySearchTree bst = new MyBinarySearchTree();
bst.a