7 二分搜索树的原理与Java源码实现

 

1 折半查找法

了解二叉查找树之前,先来看看折半查找法,也叫二分查找法
在一个有序的整数数组中(假如是从小到大排序的),如果查找某个元素,返回元素的索引。
如下:

int[] arr = new int[]{1,3,4,6,8,9}; 在 arr 数组中查找6这个元素,查到返回对应的索引,没有找到就返回-1

思想很简单:
1 先找到数组中间元素target与6比较
2 如果target比6大,就在数组的左边查找
3 如果target比6小,就在数组的右边查找

java实现代码如下:

    private static int binarySearch(int[] data, int target) {         int l = 0;         int r = data.length - 1;          while (l <= r) {             //int mid = (l + r) / 2;             //这句代码理论上是没有问题的,但是是有bug的             //如果因为 l + r 会超过整数的最大值,就会溢出             //所以换成下面的写法,最小边界,加上差的一半,就是中间索引              //最小边界,加上差的一半,就是中间值             int mid = l + (r - l) / 2;               if (data[mid] > target) { //如果中间的值比target大,r向右移动。                 r = mid - 1;             } else if (data[mid] < target) { //如果中间的值比target小,l向左移动                 l = mid + 1;             } else {                 return mid; //如果中间的值与target相等,就返回下标             }         }          //没有找到就返回-1         return -1;     }

测试代码如下:

 public static void main(String[] args) {         int[] data = new int[]{1,3,4,6,8,9};         System.out.println(binarySearch(data, 6));     }

输出

3

折半查找的关键是数组必须有序,一次过滤掉一半的数据,时间复杂度为O(logN)。
上面是以2为底的,N为数组的元素个数.

折半查找和下面的要讲的二分搜索树是有一样的思想

2 二分搜索树定义

二分搜索树定义双叫二分查找树,其定义如下
1 若它的左子树不为空,则左子树上所有的节点的值均小于根结点的值
2 若它的右子树不为空,则右子树上所有的节点的值均大于根结点的值
3 它的左右子树也分别为二分搜索树

由二叉搜索树的定义可知,它前提是二叉树,并且采用了递归的定义方式
。再得,它的节点满足一定的关系,左子树的节点一定比父节点的小,
右子树的节点一定比父节点的大。

构造一棵二叉搜索树的目的,其实目的不是为了排序,是为了提高查找,删除,插入关键字的速度。

下面我们用图和代码来解释二叉树的查找,插入,和删除。比如下图就是一个二叉搜索树

2.0 二叉搜索树的定义和节点的定义

二叉搜索树中存放的都是key。先看下二叉树的定义

    //key必须继承Comparable,可以比较大小的     public class QBST<K extends Comparable<K>, V> {         ...     }

二叉树中节点的定义

   //QNode是作为QBST的内部类的。后面会有完整的源码    class QNode {         //key,也相当于上图中的数字,只不过不一定是数字         //只要能比较大小就行了。这里的key,是继承Comparable的         K key;                       //节点中的value         V value;                  //左子树         QNode left;                  //右子树         QNode right;          //根据key,value构造一个节点         QNode(K key, V value) {             this.key = key;             this.value = value;             this.left = null;             this.right = null;         }          //根据一个节点,构造另一个新节点         QNode(QNode node){             this.key = node.key;             this.value = node.value;             this.left = node.left;             this.right = node.right;         }     }

类的定义和类中节点的定义都有了。
二分搜索树的定义如下:



                    
                
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信