BST值的楼层

时间:2014-04-28 09:33:43

标签: java algorithm tree

给定一个值和一个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的新语言。

1 个答案:

答案 0 :(得分:3)

以下working Java codeO(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 + " ";
 }
}