制作一个正确的二叉树

时间:2010-11-25 09:45:00

标签: java binary-tree

    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 个答案:

答案 0 :(得分:1)

此代码不制作二叉树。这几乎是快速排序(好吧,你做的是枢轴,分区和递归调用,但是不要再把排序列表放在一起;因此差不多)原始列表。你能说出你实际想做的事吗?

答案 1 :(得分:0)

您可以在Litterate Programs看到一个工作不平衡二叉树的完美示例。 但是你知道,如果我是你,我会使用TreeSetTreeMap,这是完美的实现,前提是你给它们一个有效的比较器,你已经用一种形式或一种形式写了另一个。

答案 2 :(得分:0)

通过查看它几乎不可能进行调试。我建议编写一个验证方法,检查树结构的正确性,然后在树上的每次操作后调用它。这应该可以帮助您确定出错的时间和地点。

答案 3 :(得分:0)

这是我用来实现二叉树及其操作的代码:

<?php

类节点 {  公共数据;  public $ leftChild;  public $ rightChild;

public function __construct($ data)   {    $这 - &GT;数据= $数据;    $这 - &GT; leftChild = NULL;    $这 - &GT; rightChild = NULL;   }  公共函数disp_data()   {    echo $ this-&gt; data;   }

} //结束类节点 class BinaryTree {  public $ root;  // public $ s;  公共函数__construct()   {    $这 - &GT;根= NULL;    // $这 - &GT; S =的file_get_contents( '存储');

} //用于显示树的功能   公共功能显示()   {    $这 - &GT; display_tree($这 - &GT;根);

}   public function display_tree($ local_root)   {

如果($ local_root == NULL)      返回;     $这 - &GT; display_tree($ local_root-&GT; leftChild);     echo $ local_root-&gt; data。“
”;     $这 - &GT; display_tree($ local_root-&GT; rightChild);

} //用于插入新节点的功能   公共函数插入($ key)    {     $ newnode = new Node($ key);       如果($这 - &GT;根== NULL)         {          $这 - &GT;根= $ newnode;          返回;         }       其他         {          $父= $这 - &GT;根;          $电流= $这 - &GT;根;            而(真)              {                $父= $电流;                  // $这 - &GT; find_order($键,$电流 - &GT;数据);                 如果($键==($这 - &GT; find_order($键,$电流 - &GT;数据)))                   {                       $电流= $电流 - &GT; leftChild;                        如果($当前== NULL)                          {                           $父 - &GT; leftChild = $ newnode;                           返回;                          } //结束if2                   } //结束if1                 其他                   {                       $电流= $电流 - &GT; rightChild;                        如果($当前== NULL)                          {                           $父 - &GT; rightChild = $ newnode;                           返回;
                         } //结束if1
                  } //结束其他              } //结束while循环         } //结束其他

} //结束插入功能

//搜索特定节点的功能  公共功能查找($ key)   {     $电流= $这 - &GT;根;      而($电流 - &GT;!数据= $键)           {             如果($键== $这 - &GT; find_order($键,$电流 - &GT;数据))               {                 $电流= $电流 - &GT; leftChild;               }             其他               {                 $电流= $电流 - &GT; rightChild;               }             如果($当前== NULL)               返回(NULL);

      }
     return($current->data); 

} //结束要搜索的功能  公共函数delete1($ key)   {     $电流= $这 - &GT;根;     $父= $这 - &GT;根;

$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 

else if($ current-&gt; rightChild == null)        {           如果($当前== $这 - &GT;根)            $这 - &GT;根= $电流 - &GT; leftChild;           else if($ isLeftChild == true)            {             $父 - &GT; leftChild = $电流 - &GT; leftChild;            }           其他            {             $父 - &GT; rightChild = $电流 - &GT; leftChild;            }
          返回($电流);        } //结束其他if1     //删除具有rightChild的节点    否则if($ current-&gt; leftChild == null)        {          如果($当前== $这 - &GT;根)            $这 - &GT;根= $电流 - &GT; rightChild;          else if($ isLeftChild == true)            {             $父 - &GT; leftChild = $电流 - &GT; rightChild;            }
         其他            {             $父 - &GT; rightChild = $电流 - &GT; rightChild;            }
           返回($电流);        }
   //删除具有两个子节点的节点     其他        {         $后继= $这 - &GT; get_successor($电流);         如果($当前== $这 - &GT;根)           {             $这 - &GT;根= $后继;

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

} //结束删除节点的功能 //查找后继节点的函数  public function get_successor($ delNode)   {    $ succParent = $ delNode;    $继任= $ delNode;    $温度= $ delNode-&GT; rightChild;     而($温度!= NULL)          {           $ succParent = $继任者;           $继任= $温度;           $温度= $ TEMP-&GT; leftChild;          }    如果($继任= $ delNode-&GT;!rightChild)      {       $ succParent-&GT; leftChild = $ successor-&GT; rightChild;       $ successor-&GT; rightChild = $ delNode-&GT; rightChild;      }   回报($继任者);   } //函数查找两个字符串的顺序  public function find_order($ str1,$ str2)   {      $ STR1 =用strtolower($ STR1);      $ STR2 =用strtolower($ STR2);      $ I = 0;      $ J = 0;

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

而(真)    {
       如果(ORD($ P1)

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

} //结束时

} //结束函数查找字符串顺序

公共职能is_empty()   {     如果($这 - &GT;根== NULL)       返回(真);     其他       返回(假);   } } //结束类BinaryTree ?&GT;