数据结构与算法分析(Java语言描述)(20)—— 二叉搜索树指定key的前驱、后继
2017-11-15 13:38
246 查看
前驱
// -------------------------------------------------------------------- // 查找 key 的前驱 public Key predecessor(Key key){ // 在二叉搜索树中查找 key 对应的节点 Node node = search(root, key); // 如果 key 对应的节点不存在,则 key 没有前驱,返回 null if (node == null) return null; // 如果 key 对应节点的左子树不为空,则返回左子树最大 key if (node.left != null) return maximum(node.left).key; // 否则,key 的前驱在从根节点到 key 的路径上,在这个路径上寻找到比 key 小的最大值 // 即为 key 的前驱 Node preNode = predecessorFromAncestor(root, key); return preNode == null ? null : preNode.key; } // 在以node为根的二叉搜索树中, 寻找key的祖先中,比key小的最大值所在节点, 递归算法 // 算法调用前已保证key存在在以node为根的二叉树中 private Node predecessorFromAncestor(Node node, Key key){ if (key.compareTo(node.key) == 0) return null; Node maxNode; if (key.compareTo(node.key) < 0){ // 如果当前节点 > key,则当前节点不可能是比 key 小的最大值 // 向下搜索到的结果直接返回 return predecessorFromAncestor(node.left, key); }else { // key > node.key // 如果当前节点 < key,则当前节点可能是比 key 小的最大值 // 向下搜索结果存储到 maxNode 中 maxNode = predecessorFromAncestor(node.right, key); if (maxNode != null) // maxNode 和当前节点 node 取最大值返回 return maxNode.key.compareTo(node.key) > 0 ? maxNode: node; else // maxNode 为,返回 node return node; } }
后继
// -------------------------------------------------------------------- // 查找 key 的后继 // 查找key的后继, 递归算法 // 如果不存在key的后继(key不存在, 或者key是整棵二叉树中的最大值), 则返回 null public Key successor(Key key){ Node node = search(root, key); // 如果key所在的节点不存在, 则key没有前驱, 返回 null if (node == null) return null; // 如果key所在的节点右子树不为空,则其右子树的最小值为key的后继 if (node.right != null) return minimum(node.right).key; // 否则, key的后继在从根节点到key的路径上, 在这个路径上寻找到比key大的最小值, 即为key的后继 Node sucNode = successorFromAncestor(root, key); return sucNode == null ? null : sucNode.key; } // 在以node为根的二叉搜索树中, 寻找key的祖先中,比key大的最小值所在节点, 递归算法 // 算法调用前已保证key存在在以node为根的二叉树中 private Node successorFromAncestor(Node node, Key key){ if (key.compareTo(node.key) == 0){ return null; } Node minNode = null; if (key.compareTo(node.key) > 0 ){ // 如果当前节点小于key, 则当前节点不可能是比key大的最小值 // 向下搜索到的结果直接返回 return successorFromAncestor(node.right, key); }else { // key < node.key // 如果当前节点大于key, 则当前节点有可能是比key大的最小值 // 向下搜索结果存储到minNode中 minNode = successorFromAncestor(node.left, key); if (minNode != null) // minNode和当前节点node取最小值返回 return minNode.key.compareTo(node.key) > 0 ? node : minNode; else // 如果minNode为空, 则当前节点即为结果 return node; } }
相关文章推荐
- 数据结构与算法分析(Java语言描述)(19)—— 二叉搜索树删除指定的节点
- 数据结构与算法分析(Java语言描述)(16)—— 二叉搜索树基础、节点插入、查找
- 数据结构与算法分析笔记与总结(java实现)--二叉树20:二叉搜索树的后序遍历序列
- 数据结构与算法分析(Java语言描述)(17)—— 二叉搜索树的深度优先与广度优先遍历
- [数据结构] 二叉搜索树 前驱和后继的经验总结
- 数据结构与算法分析(Java语言描述)(18)—— 二叉搜索树最大、最小子节点的搜索、删除
- (Swift 实现)二叉搜索树 —— 创建,最大,最小,查找,插入,删除,前驱,后继,中序遍历
- 求二叉搜索树任一节点的前驱后继节点
- php实现数组按指定KEY排序的方法
- Hbase rest方式获取指定key范围内的值
- jmeter正则表达式匹配指定json对象中的指定的key的值
- 数据结构与算法分析(Java语言描述)(33)—— 散列表
- 二叉查找树前驱、后继,非递归不使用栈不使用访问标记的中序遍历,最大最小节点
- 从dict中一次性取出指定一组key对应的value
- 获取Redis所有Key / 删除指定前缀的Key
- BZOJ 1588 朴素TREAP,寻找前驱和后继
- 单链表很类似于栈,先插入的后遍历,删除也是删除最后插进来的。但增加的指定查找和指定删除的方法增加了灵活性,可以删除、查找指定key
- mongo从怎么在指定查询条件的前提下从数据库中读出指定key对应的value
- 数据结构与算法分析 c++11 题3.1 由一个链表元素指定另一个链表对应位置的元素输出
- 笨办法学 Python · 续 练习 20:二叉搜索树