Этаж стоимости в BST

1

Учитывая значение и BST, нам нужно найти наибольшее число, которое просто меньше или равно заданному значению, т.е. Пол значения. Например, 1 4 7 9 12 13 43 45 является данным в обходном пути BST, и нам дается значение 15.

Таким образом, пол (15) = 13, пол (10) = 9 и т.д.

Я делал inOrder обход и поддерживал предыдущий узел, и если значение находится между данными предыдущего и корневого узла, тогда возвращайте это значение как пол. Однако это не работает для всех случаев.

Кроме того, поскольку это BST, нам не нужно делать полный обход, мы можем использовать свойство BST. Но я не могу преобразовать свою логику в код. Так может кто-нибудь помочь с этим?

Предпочтительно в Java. Мы должны использовать его в нашем проекте, в котором мы создаем новый язык на основе Java.

Теги:
algorithm
tree

1 ответ

3
Лучший ответ

Следующий рабочий код Java решает эту проблему в 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 + " ";
 }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню