Java 以BST表示的值的下限
给定一个值和一个BST,我们需要找到一个最大的数,它正好小于或等于给定的值,即值的下限。例如,1 4 7 9 12 13 43 45是BST的给定按序遍历,我们得到了一个值15 所以楼层(15)=13,楼层(10)=9,等等 我在做顺序遍历和维护前一个节点,如果值在前一个节点和根节点的数据之间,则将该值返回为floor。然而,它并不适用于所有情况 此外,由于它是一个BST,我们不需要进行完全遍历,我们可以利用BST属性。但我无法将我的逻辑转换成代码。有人能帮忙吗 最好用Java。我们需要在我们的项目中使用它,在我们的项目中,我们正在创建一种基于Java的新语言。以下内容在Java 以BST表示的值的下限,java,algorithm,tree,Java,Algorithm,Tree,给定一个值和一个BST,我们需要找到一个最大的数,它正好小于或等于给定的值,即值的下限。例如,1 4 7 9 12 13 43 45是BST的给定按序遍历,我们得到了一个值15 所以楼层(15)=13,楼层(10)=9,等等 我在做顺序遍历和维护前一个节点,如果值在前一个节点和根节点的数据之间,则将该值返回为floor。然而,它并不适用于所有情况 此外,由于它是一个BST,我们不需要进行完全遍历,我们可以利用BST属性。但我无法将我的逻辑转换成代码。有人能帮忙吗 最好用Java。我们需要在我们的
O(logn)
时间内解决了这个问题
逻辑很简单。如果当前节点中的值小于val,则在当前节点的右子树中查找较大的值,或在左子树中查找答案
void run(){
Obj root = new Obj(1);
root = insertVal(root, 4);
root = insertVal(root, 7);
root = insertVal(root, 9);
root = insertVal(root, 12);
root = insertVal(root, 13);
root = insertVal(root, 43);
root = insertVal(root, 45);
System.out.println(floor(root, 15));
}
// throws a RuntimeException if there is no smaller value in the BST.
int floor(Obj root, int val){
int ans = Integer.MIN_VALUE;
boolean found = false;
while(root != null){
if(root.val==val){
return val;
}
if(val < root.val){
root = root.left;
}else{
found = true;
ans = root.val;
root = root.right;
}
}
if(!found){
throw new RuntimeException("There is no smaller value than " + val + " in the BST");
}
return ans;
}
Obj insertVal(Obj root, int val){
if(root==null){
return new Obj(val);
}
if(val < root.val){
root.left = insertVal(root.left, val);
}else{
root.right = insertVal(root.right, val);
}
return root;
}
}
class Obj{
int val;
Obj right;
Obj left;
public Obj(int val){
this.val = val;
right = left = null;
}
public String toString(){
return val + " ";
}
}
void run(){
Obj根=新Obj(1);
根=插入值(根,4);
root=insertVal(root,7);
root=insertVal(root,9);
根=插入值(根,12);
根=插入值(根,13);
根=插入值(根,43);
根=插入值(根,45);
系统输出打印LN(楼层(根,15));
}
//如果BST中没有较小的值,则引发RuntimeException。
内部楼层(Obj根,内部val){
int ans=整数的最小值;
布尔值=false;
while(root!=null){
if(root.val==val){
返回val;
}
if(val