给定一个值和一个BST,我们需要找到最小数量,它只是小于或等于给定值,即值的下限。例如,1 4 7 9 12 13 43 45是BST的给定inOrder遍历,我们给出值15。
所以floor(15)= 13,floor(10)= 9等等。
我正在执行inOrder遍历并维护上一个节点,如果值在previous和root节点的数据之间,则返回该值作为floor。但是,它并不适用于所有情况。
此外,由于它是BST我们不需要完成遍历,我们可以使用BST属性。但我无法将我的逻辑转换为代码。那么有人可以帮忙吗?
最好是Java。我们需要在我们的项目中使用它,我们在其中创建一种基于Java的新语言。
答案 0 :(得分:3)
以下working Java code在O(log N)
时间内解决了这个问题。
逻辑非常简单。如果当前节点中的值小于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 + " ";
}
}