二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树:
(1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3) 任意节点的左、右子树也分别为二叉查找树;
(4) 没有键值相等的节点。
如上图所示,是不同形态的二叉查找树。
二叉查找树是对要查找的数据进行生成树,左支的值小于右支的值。
在查找的时候也是一样的思路,从根节点开始,比节点大进入右支,比节点小进入左支,直到查找到目标值。
二叉查找树的插入算法比较简单:空树,就首先生成根节点;不是空树就按照查找的算法,找到父节点,然后作为叶子节点插入,如果值已经存在就插入失败。
删除操作稍微复杂一点,有如下几种情况:
(1)如果删除的是叶节点,可以直接删除;
(2)如果被删除的元素有一个子节点,可以将子节点直接移到被删除元素的位置;
(3)如果有两个子节点,这时候就采用中序遍历,找到待删除的节点的后继节点,将其与待删除的节点互换,此时待删除节点的位置已经是叶子节点,可以直接删除。如下图:
将待删除节点与后继节点互换,变成如下图所示:
将待删除元素删除,如下图所示:
另外,二叉查找树还有一个性质,即对二叉查找树进行中序遍历,即可得到有序的数列。
二叉查找树的查询复杂度,和二分查找一样,插入和查找的时间复杂度均为 O(logn) ,但是在最坏的情况下仍然会有 O(n) 的时间复杂度。原因在于插入和删除元素的时候,树没有保持平衡(如上不同形态的二叉树图中的b)。