сделать правильное двоичное дерево - PullRequest
0 голосов
/ 25 ноября 2010
    private void dcHullForUpperHull(List<Point> list, Point p, Point q) {
    List<Point> upperH = new ArrayList<Point>();
    List<Point> lowerH = new ArrayList<Point>();
    int low = 0;
    int high = list.size()-1;

    System.out.println(list);
    if(low<high) {

        Point pivot = list.get((low+high)/2);

        for (Point point : list) {
            boolean bool = Determinate.isPointLeftSide(q, pivot, point);

            if (bool == true ) {
                upperH.add(point);
            }
        }
        for (Point point : list) {
            boolean bool = Determinate.isPointLeftSide(pivot, p, point);
            boolean bool1 = Determinate.isPointOnLine(pivot, p, point);
            if (bool == true || bool1==true) {
                lowerH.add(point);
            }
        }

        System.out.println(pivot.toString());
        System.out.println(upperH.toString());
        System.out.println(lowerH.toString());

        dcHullForUpperHull(upperH, pivot, q);           
        dcHullForUpperHull(lowerH, p, pivot);



    }
}

и печатает:

[X :132.0  Y: 140.0angle0.0, X :162.0  Y: 116.0angle0.0, X :210.0  Y: 112.0angle0.0, `enter code here`X:258.0  Y: 117.0angle0.0]
X :162.0  Y: 116.0angle0.0
[X :210.0  Y: 112.0angle0.0, X :258.0  Y: 117.0angle0.0]
[X :132.0  Y: 140.0angle0.0, X :162.0  Y: 116.0angle0.0]
[X :210.0  Y: 112.0angle0.0, X :258.0  Y: 117.0angle0.0]
X :210.0  Y: 112.0angle0.0
[X :258.0  Y: 117.0angle0.0]
[X :210.0  Y: 112.0angle0.0]
[X :258.0  Y: 117.0angle0.0]
[X :210.0  Y: 112.0angle0.0]
[X :132.0  Y: 140.0angle0.0, X :162.0  Y: 116.0angle0.0]
X :132.0  Y: 140.0angle0.0
[]
[X :132.0  Y: 140.0angle0.0]
[]
[X :132.0  Y: 140.0angle0.0]

И ясно, что мое двоичное дерево не в порядке !! также метод "isPointLeftSide" скажет, что точка осталась от одной строки с ее определителем. Но моя главная проблема заключается в следующем: двоичное дерево не в порядке. И у меня будет несколько пустых внешних узлов. Помогите мне, пожалуйста спасибо

Ответы [ 4 ]

1 голос
/ 25 ноября 2010

Этот код не делает двоичным деревом.Это почти быстрая сортировка (ну, вы делаете pivot, раздел и рекурсивный вызов, но не собираете отсортированный список снова, а следовательно, почти) оригинальный список.Можете ли вы указать, что вы на самом деле думаете делать

0 голосов
/ 05 декабря 2010

Это код, который я использовал для реализации двоичного дерева и его операций:

<?php

класс Node { общедоступные данные; public $ leftChild; public $ rightChild;

публичная функция __construct ($ data) { $ This-> данные = $ данных; $ This-> LeftChild = NULL; $ This-> RightChild = NULL; } публичная функция disp_data () { echo $ this-> data; }

} // Конечный класс Node класс BinaryTree { public $ root; // public $ s; публичная функция __construct () { $ This-> корень = NULL; // $ this-> s = file_get_contents ( 'магазин');

} // функция для отображения дерева отображение публичных функций () { $ This-> display_tree ($ this-> корень);

} публичная функция display_tree ($ local_root) {

если ($ local_root == NULL) вернуть; $ This-> display_tree ($ local_root-> LeftChild); echo $ local_root-> data. "
"; $ This-> display_tree ($ local_root-> RightChild);

} // функция для вставки нового узла вставка публичной функции ($ key) { $ newnode = new Node ($ key); если ($ this-> корень == NULL) { $ This-> корень = $ newnode; вернуть; } еще { $ Родитель = $ this-> корень; $ Тока = $ this-> корень; в то время как (истина) { $ Родитель = $ тока; // $ this-> find_order ($ ключ, $ current-> данные); если (ключ == $ ($ this-> find_order ($ ключ, $ current-> данные))) { $ Ток = $ current-> LeftChild; если ($ тока == NULL) { $ Родительский,> LeftChild = $ newnode; вернуть; } // end if2 } // конец if1 еще { $ Ток = $ current-> RightChild; если ($ тока == NULL) { $ Родительский,> RightChild = $ newnode; возвращение;
} // end if1
} // конец еще } // конец цикла } // end else

} // функция окончания вставки

// функция для поиска определенного узла публичная функция find ($ key) { $ Тока = $ this-> корень; в то время как ($ current-> данные! = $ ключ) { если ($ ключ == $ this-> find_order ($ ключ, $ current-> данные)) { $ Ток = $ current-> LeftChild; } еще { $ Ток = $ current-> RightChild; } если ($ тока == NULL) вернуться (нуль); * * 1022

      }
     return($current->data); 

} // завершаем функцию для поиска публичная функция delete1 ($ key) { $ Тока = $ this-> корень; $ Родитель = $ this-> корень;

$isLeftChild=true;
 while($current->data!=$key)
      {
       $parent=$current;
       if($key==($this->find_order($key,$current->data)))
         {
          $current=$current->leftChild;
          $isLeftChild=true;
         }   
       else
         {
          $current=$current->rightChild;
          $isLeftChild=false;   
         } 
        if($current==null)
          return(null);
      }//end while loop 

  echo "<br/><br/>Node to delete:".$current->data;
 //to delete a leaf node 
 if($current->leftChild==null&&$current->rightChild==null)
   {
       if($current==$this->root)
          $this->root=null;  
      else if($isLeftChild==true)
       {
        $parent->leftChild=null;
       }  
     else
       {
        $parent->rightChild=null;
       }
     return($current);       
   }//end if1
 //to delete a node having a leftChild 

иначе, если ($ current-> rightChild == null) { если ($ == ток $ this-> корень) $ This-> корень = $ current-> LeftChild; иначе если ($ isLeftChild == true) { $ Родительский,> LeftChild = $ current-> LeftChild; } еще { $ Родительский,> RightChild = $ current-> LeftChild; }
возврата ($ тока); } // end else if1 // удалить узел, имеющий rightChild иначе если ($ current-> leftChild == null) { если ($ тока == $ this-> корень) $ This-> корень = $ current-> RightChild; иначе если ($ isLeftChild == true) { $ Родительский,> LeftChild = $ current-> RightChild; }
еще { $ Родительский,> RightChild = $ current-> RightChild; *} 1030 * возврата ($ тока); }
// удалить узел, имеющий обоих потомков еще { $ Правопреемник = $ этом-> get_successor ($ тока); если ($ тока == $ this-> корень) { $ This-> корень = $ правопреемник;

      }
    else if($isLeftChild==true)
      {
       $parent->leftChild=$successor;
      }
    else
      {
       $parent->rightChild=$successor;
      }     
     $successor->leftChild=$current->leftChild;
    return($current);
   }   

} // завершаем функцию удаления узла // Функция для поиска узла-преемника публичная функция get_successor ($ delNode) { $ SuccParent = $ delNode; $ Преемник = $ delNode; $ Темп = $ delNode-> RightChild; в то время как ($ темп! = NULL) {$ SuccParent = $ правопреемник;$ Правопреемника = $ темп;$ Темп = $ TEMP-> LeftChild;} if ($ successor! = $ delNode-> rightChild) {$ succParent-> leftChild = $ successor-> rightChild;$ Successor-> RightChild = $ delNode-> RightChild;} return ($ successor);} // функция для поиска порядка двух строк public function find_order ($ str1, $ str2) {$ str1 = strtolower ($ str1);$ Str2 = strtolower ($ str2);$ I = 0;$ j = 0;

 $p1=$str1[i];
 $p2=$str2[j]; 

while (true) {
if (ord ($ p1)

       return($str1);
     }
  else
     {
       if(ord($p1)==ord($p2))
         {
          $p1=$str1[++$i];
          $p2=$str2[++$j];
          continue;
         }
      return($str2); 
     }

} // конец при

} // конецфункция найти порядок строк

публичная функция is_empty () {if ($ this-> root == null) return (true); else return (false);}} // конец класса BinaryTree?>

0 голосов
/ 25 ноября 2010

Тонкие вещи практически невозможно отладить, просто взглянув на них. Я предлагаю написать метод проверки, который проверяет правильность древовидной структуры, а затем вызывать его после каждой операции над деревом. Это должно помочь вам точно определить, когда и где именно что-то пойдет не так.

0 голосов
/ 25 ноября 2010

Прекрасный пример работающего несбалансированного бинарного дерева можно посмотреть на Литературные программы .Но вы знаете, на вашем месте я бы вместо этого использовал TreeSet или TreeMap, которые являются идеальными реализациями, при условии, что вы дадите им действительный компаратор, который вы уже написали, в той или иной форме.

...