二叉树的addChild方法

时间:2015-12-02 06:44:29

标签: java algorithm structure binary-tree

对于一个项目,我编写了自己的二叉树类。我需要递归地构建一个左子树和右子树,所以我添加了一个makeBinaryTreeNode方法,它接受root,left Child和right Child。在其中我知道我需要在创建两个包含子数据的leftChild和rightChild树之后调用某种方法addChild,但我不知道你如何为二叉树实现编写addChild方法。我已经看过其他实现,其中子节点存储在节点列表中(Java tree data-structure?< - 此线程中的最佳答案使用列表来存储子节点),但有没有更好的方法来编写java中二进制树的addChild方法?任何帮助表示赞赏!

2 个答案:

答案 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,这是左侧和右侧的叶节点的总和。那么你可以将新节点总是添加到叶子较少的一侧。

但是他们更好地平衡技术,例如红黑树。