寻找floor , ceil无需保证。
以floor实现为例:
- 若key值存在,那么floor , ceil就是key值自身。
- 若key值不存在:
- floor:是最接近key值且**小于**key的节点
- ceil:是最接近key值且**大于**key的节点
例如下图,举几个例子来了解:
- 节点41的floor , ceil是41;
- 45的floor是42,ceil是50;
- 64无ceil,floor是61;
- 11无floor,ceil是13。
(2)代码实现
这里寻找floor 或 ceil 的逻辑主要分为3个步骤(这里只列出寻找floor 的步骤,ceil 同理,在此不赘述):
- 如果node的key值和要寻找的key值相等:则node本身就是key的floor节点。
- 如果node的key值比要寻找的key值大:则要寻找的key的floor节点一定在node的左子树中。
- 如果node的key值比要寻找的key值小:则node有可能是key的floor节点, 也有可能不是(存在比node->key大但是小于key的其余节点),需要尝试向node的右子树寻找一下。
以floor实现为例:
public Key floor(Key key){ if( count == 0 || key.compareTo(minimun()) < 0 ) return null; Node floorNode = floor(root, key); return floorNode.key; } private Node floor(Node node, Key key){ if(node == null) return null; //如果该node的key和key相等,就是本身 if(node.key.compareTo(key) == 0){ return node; } //如果该node比key要大的话 if(node.key.compareTo(key) > 0){ return floor(node.left, key); } //如果node比key小,可能是,也能是不是 Node tempNode = floor(node.right, key); if(tempNode != null) return tempNode; return node; //想当于 tempNode == null }
总结:
局限性:二分搜索树可能退化成链表,实际操作中还是有左孩子的概念,只不过一直是判断时空的情况,二分搜索树的查找过程与高度相关,此高度为n,时间复杂度O(n^2),但是如果要保证高度是logn级别的,无法退化成链表,经典实现就是红黑树,是一颗平衡二叉树,左右子树高度差不超过1~
树形问题:
尽管没有一棵树,但是会用到树结构,这种结构有天然的递归性质。
1. 排序问题
(1)归并排序
例如之前讲解排序算法中的归并排序,回忆其重点,将数组逐渐分成两个部分,分别排序,再逐渐归并起来。这整个过程归纳起来就是一棵树的情况,虽然在解决问题时并未创建树结构。
(2)快速排序
同理,快速排序中找到数组的标志点将其一分为二,在子数组中继续找到标志点再将其一份为二。其过程都是对数的一次遍历,类似于后序遍历或前序遍历。
2. 搜索问题
递归方式对于搜索问题更是尤为重要!事实上,绝大部分计算机问题都可以使用搜索方式解决。
一条龙游戏,八皇后,数独