5-2 二分搜索树基础

来源:互联网 发布:科比04年总决赛数据 编辑:程序博客网 时间:2024/06/03 06:25

二分搜索树这个数据结构的提出,是自来于“查找表”或者说“字典”这种数据结构的。

实现查找表,可以通过“普通数组”“顺序数组”“二分搜索树”来实现。其中,最有效的方式就是实现二分搜索树。

图:普通数组、顺序数组、二分搜索树对查找、插入、删除元素的时间复杂度分析

对于上表的说明:

普通数组的插入操作:要先查找有没有这个元素,然后插入或者覆盖。

普通数组的删除操作:要先查找有没有这个元素,然后删除或者什么都不做。

顺序数组的查找操作:可以使用二分查找法,二分查找法的时间复杂度就是 O(logn)。

二分搜索树的特点

二分搜索树的最大特性是:高效。不仅可以用于查找数据,还可以高效地插入、删除。但是二分搜索树的重要意义还在于动态地维护数据(这一点和堆很像)。这一点要等待我们这一章学习完成以后细细地体会。

借助二分搜索树这个数据结构,我们可以轻松地实现以下函数:min、max、floor、ceil、rank、select。即二分搜索树还可以回答很多数据之间的关系的问题。

查一查:二分搜索树(Binary Search Tree)的定义

二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:

1、每个结点都有一个作为搜索依据的关键码(key),所有结点的关键码互不相同;

2、左子树(如果非空)上所有结点的关键码都小于根结点的关键码;

3、右子树(如果非空)上所有结点的关键码都大于根结点的关键码;

4、左子树和右子树也是二叉搜索树;

5、结点左子树上所有关键码小于结点关键码;

6、结点右子树上所有关键码大于结点关键码;

7、若从根结点到某个叶结点有一条路径,路径左边的结点的关键码不一定小于路径上的结点的关键码。

8、如果对一棵二叉搜索树进行中序遍历,可以按从小到大的顺序,将各结点关键码排列起来,所以也称二叉搜索树为二叉排序树。

每个节点的键值大于左孩子;
每个节点的键值小于右孩子;以左右孩子为根的子树仍为二分搜索树。

性质:

1、大于每一个左节点

2、小于每一个右节点

二分搜索树的定义的天然地包括了递归的思想。尤其,我们还要注意到,二分搜索树不一定是完全二叉树。

下面是一个二分搜索树的基本实现:

public class BST {    // 就一个根节点    private Node root;    private int count;    public BST(){       root = null;        count = 0;    }    public int size() {        return count;    }    public boolean isEmpty() {        return count == 0;    }    class Node {        private int key;        private int value;        private Node left;        private Node right;        public Node(int key, int value) {            this.key = key;            this.value = value;            this.left = null;            this.right = null;        }    }}
原创粉丝点击