Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以BST表示的值的下限_Java_Algorithm_Tree - Fatal编程技术网

Java 以BST表示的值的下限

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。我们需要在我们的

给定一个值和一个BST,我们需要找到一个最大的数,它正好小于或等于给定的值,即值的下限。例如,1 4 7 9 12 13 43 45是BST的给定按序遍历,我们得到了一个值15

所以楼层(15)=13,楼层(10)=9,等等

我在做顺序遍历和维护前一个节点,如果值在前一个节点和根节点的数据之间,则将该值返回为floor。然而,它并不适用于所有情况

此外,由于它是一个BST,我们不需要进行完全遍历,我们可以利用BST属性。但我无法将我的逻辑转换成代码。有人能帮忙吗

最好用Java。我们需要在我们的项目中使用它,在我们的项目中,我们正在创建一种基于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