7.二叉搜索树

如果维护一个有序的动态数组,使用二分搜索,最坏时间复杂度: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;
        }
    }

}

猜你喜欢

转载自www.cnblogs.com/doupi/p/13180407.html