二叉查找树(又叫作二叉搜索树或二叉排序树)是一种数据结构,采用了图的树形结构。数据存储于二叉查找数的各个结点中。

图1就是二叉查找树的例子。结点中的数字便是存储的数据。此处以不存在相同的数字为前提进行说明。


二叉查找树有两个特点。第一个是每个结点的值均大于其左子树上任意一个结点的值。比如结点9大于 左子树上的3和8.


同样,结点15大于其左子树上任意一个结点的值。


第二个特点是每个结点的值均小于其右子树上任意一个结点的值。比如结点15小于其右子树上的 23 17 28.



根据这两个特点可以得到以下结论。第一,二叉查找树的最小结点要从顶端开始,往其左下的末端寻找。此处最小值为3.



第二,二叉查找树的最大结点要从顶端开始,往其右下的末端寻找。此处最大值值为28



下面我们来往二叉查找树种添加数据,比如添加数字1.


首先,从而叉查找树的顶端结点开始寻找添加数字的位置。将想要添加的1与该结点的值进行比较,小于它则往左移,大于大则往右移。



由于1<9,所以将1往左移。


由于1<3,所以继续将1往左移,但前面已经没有结点了,所以把1作为新的结点添加到左下方。



这样,1的添加操作完成了。


接下来,我们来添加数字4


和前面的步骤一样,首先从二叉查找树的顶端结点开始寻找添加数据的位置。


由于4<9,所以将4往左移。


由于4>3,所以将4往右移。


由于4<8,所以将4往左移。但前面没有结点了,所以把4作为一个新的结点添加到其下方。


于是4就添加完成了。


接下来看看如何在二叉查找树中删除结点。比如我们来试一试删除结点28.


如果需要删除的结点没有子结点,直接删除该结点即可。



我们在来删除结点8.


如果需要删除的结点值有一个字结点,那么先删除目标结点。


然后把子结点移动到被删除结点的位置即可。


最后我们来试一下删除结点9.



如果需要删除的结点有两个子结点,那么先删除掉目标结点。



然后在被删除的结点的左子树中寻找最大的结点。



最后将最大的结点移动被删除的结点位置上,这样一来,就能满足二叉查找树的性质的前提下删除结点可。



接下来我们来看看如果在二叉树中查找结点例如,我们要寻找12



从二叉查找树的顶端结点开始往下查找。和添加数据时一样,把12和结点中的值进行比较,小于该结点往左移,大于则往右移。


由于12>4,根据特性往右移。



最后比较,相等就找到了12.


我们可以把二叉查找树当作是二分查找算法的思想的树形结构体现.它具有前面提到的两个特性,所以在查找数据或寻找适合添加的数据位置时,值要将其和现有的数据比较大小,就可以根据比较结果知道往那边移动。

比较的次数取决于树的高度,所以如果结点数为n,而且树的形状又比较均衡的话,比较大小和移动的次数最后就是log2n因此,时间复杂度为O(logn),但是,如果树的形状朝单侧纵向延伸,树就会变得很搞,此时时间复杂度也就变成了,O(n).