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"
会说该点留有一行与其确定。但我的主要问题是:二叉树不正常。我将有一些空的外部节点。
请帮我
感谢
答案 0 :(得分:1)
此代码不制作二叉树。这几乎是快速排序(好吧,你做的是枢轴,分区和递归调用,但是不要再把排序列表放在一起;因此差不多)原始列表。你能说出你实际想做的事吗?
答案 1 :(得分:0)
您可以在Litterate Programs看到一个工作不平衡二叉树的完美示例。
但是你知道,如果我是你,我会使用TreeSet
或TreeMap
,这是完美的实现,前提是你给它们一个有效的比较器,你已经用一种形式或一种形式写了另一个。
答案 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;