floor ceil的实现
问题描述:
波波老师好,能麻烦您帮我看一下实现的代码对不对吗
相关代码:
/*
找到比target小的最大值
*/
public E floor(E target) {
return floor(root, target);
}
/**
* 找到node为根节点,值比target小的最大值
* 由于不涉及添加删除,返回值不需要node
*/
private E floor(Node node, E target) {
//递归到底基本问题
if (node == null) {
//没有找到比target小的值
return null;
}
//递归
if (target.compareTo(node.e) <= 0) {
return floor(node.left, target);
} else {
//node是比target小的节点,但可能不是最大的,如果存在右节点说明不是要找的
if (node.right == null) {
return node.e;
}else {
//判断node的右节点是不是也小于目标值
//如果右节点大于目标值,由于node的右子树都要大于node,所以node就是小于目标的最大值
if (node.right.e.compareTo(target) < 0) {
return floor(node.right, target);
} else {
return node.e;
}
}
}
}
//找到比target大的最小值
public E ceil(E target) {
return ceil(root, target);
}
//递归实现找到node为根节点,值比target大的最小值
private E ceil(Node node, E target) {
if (node == null) {
return null;
}
if (node.e.compareTo(target) <= 0) {
//如果节点值比target小,说明要往更大的右边找
return ceil(node.right, target);
}else{
//节点值大于target,node可能是,还需要判断node的左子树有没有比node小的
if (node.left == null) {
return node.e;
} else {
//node存在左子树,如果左子树也大于目标,递归,否则返回Node
if (node.left.e.compareTo(target) > 0) {
return ceil(node.left, target);
} else {
return node.e;
}
}
}
}
27
收起
正在回答
2回答
BST floor 和 ceil 的实现,可以参考我在这里的参考代码:https://git.imooc.com/class-105/Play-Algorithms-and-Data-Structures/src/master/15-Binary-Search-Tree/Optional-01-Floor-and-Ceil-in-BST/src/BST.java
(316 行开始)
继续加油!:)
假蛙工程师
2021-12-05 10:17:02
floor和ceil的非递归实现
// 查找<=e的最大值
public E floor(E e){
E ret = null;
Node cur = root;
while(cur != null){
if(e.compareTo(cur.e) < 0) {
cur = cur.left;
}else if(e.compareTo(cur.e) >= 0){
ret = cur.e;
cur = cur.right;
}
}
return ret;
}
// 查找二分搜索树中>=e的最小值
public E ceil(E e){
E ret = null;
Node cur = root;
while(cur != null){
if(e.compareTo(cur.e) <= 0){
ret = cur.e;
cur = cur.left;
}else{
cur = cur.right;
}
}
return ret;
}
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星