对于一个项目,我编写了自己的二叉树类。我需要递归地构建一个左子树和右子树,所以我添加了一个makeBinaryTreeNode方法,它接受root,left Child和right Child。在其中我知道我需要在创建两个包含子数据的leftChild和rightChild树之后调用某种方法addChild,但我不知道你如何为二叉树实现编写addChild方法。我已经看过其他实现,其中子节点存储在节点列表中(Java tree data-structure?< - 此线程中的最佳答案使用列表来存储子节点),但有没有更好的方法来编写java中二进制树的addChild方法?任何帮助表示赞赏!
答案 0 :(得分:0)
void setClusters(std::vector<Cluster> &clusters, const std::vector<Point> points){ // points can be const now
int sendToCluster = 99999999;
for(int index = 0; index < points.size(); index++){
double minDist = 99999999999;
const Point& p = points[index]; // use a reference to avoid copying
for(int clusterNum = 0; clusterNum < clusters.size(); clusterNum++){
double tempDist = calculateDistance(p, clusters[clusterNum].centroid);
//std::cout << "dist: " << tempDist << " clusterNum: " << clusterNum << std::endl;
if(tempDist < minDist){
minDist = tempDist;
sendToCluster = clusterNum;
}
}
//std::cout << "Pushing to clusterNUm " << sendToCluster << std::endl;
clusters[sendToCluster].pointIndices
.push_back(index); // cheap compared to pushing a "Point"
}
}
答案 1 :(得分:0)
这取决于二叉树的种类,大多数二叉树都有某种平衡,以防止查找时间不理想的树。 如果您不必进行平衡,则可以通过多种方式将子节点添加到节点中。
一个例子是: 有两种节点第一个叶子节点没有孩子,第二个内部节点有两个孩子。现在编写addChild可能会出现以下情况:
叶子节点上的:
var list = (from p in ProjectManagement.Context.Project
join a in ProjectManagement.Context.Account
on p.AccountId equals a.AccountId
select new ProjectView(){
AccountId = a.AccountId,
ProjectId = p.ProjectId,
ProjectName = p.ProjectName,
InvoicedHours = p.InvoicedHours,
AccountName = a.CompanyName,
AllottedHours = p.AllottedHours,
RemainingHours = p.RemainingHours,
UninvoicedHours = p.UninvoicedHours
}).ToList();
内部节点上的:
public Node addChild(Node n){
return new InnerNode(this,n); //without balancing new InnerNode(n,this); is fine to
}
但如果没有平衡,这是毫无意义的,并且总是退化为某种链表。
一个简单的平衡是计算分支中的叶节点。对于LeafNode,这是1,对于InnerNode,这是左侧和右侧的叶节点的总和。那么你可以将新节点总是添加到叶子较少的一侧。
但是他们更好地平衡技术,例如红黑树。