如果维护一个有序的动态数组,使用二分搜索,最坏时间复杂度:0(log2n),但是添加,删除的平均时间复杂度是O(n).
所以有一个更好的方法,就是使用二叉搜索树,添加,删除,搜索的最坏时间复杂度均优化至:O(log2n)
二叉搜索树(Binary Search Tree)
二叉搜索树是二叉树的一种,是应用非常广泛的一种二叉树,英文简称为BST.(二叉查找树,二叉排序树)
二叉搜索树特点:
- 任意一个节点的值都大于其左子树所有节点的值
- 任意一个节点的值都小于其右子树所有节点的值
- 它的左右子树也是一颗二叉搜索树
二叉搜索树可以大大提高搜索数据的效率,但是二叉搜索树存储的元素必须具备可比较性
- 比如int,double等
- 如果是自定义类型,需要指定比较方式
- 不允许为null
二叉搜索树实现(java)
package zh.datastructures.binarysearchtree; public class BinarySearchTree<E> { private int size; private Node<E> root; public int getSize(){ return size; } public boolean isEmpty(){ return size == 0; } public void clear(){ } public void add(E element){ elementNotNullCheck(element); //添加第一个节点 if (root ==null){ root = new Node<>(element,null); size++; return; } //添加的不是第一个节点,要找到父节点 Node<E> parent = root; Node<E> node = root; int cmp =0; while (node != null){ cmp = compare(element,node.element); parent = node; if (cmp > 0 ){ node = node.right; } else if(cmp < 0 ) { node = node.left; } else{ return; } } //看最后新增加节点插入到父节点的哪个位置 Node<E> newNode = new Node<>(element,parent); if(cmp > 0){ parent.right = newNode; }else{ parent.left = newNode; } size++; } public void remove(E element){ } public boolean contains(){ return false; } //判断元素是否为空 private void elementNotNullCheck(E element){ if (element == null){ throw new IllegalArgumentException("element must not be null!"); } } private int compare(E e1,E e2){ return 0; } private static class Node<E>{ E element; Node<E> left; Node<E> right; Node<E> parent; public Node(E element,Node<E> parent){ this.element = element; this.parent = parent; } } }