二叉搜索树 - 获得最重的路径算法c ++

时间:2012-02-08 13:28:35

标签: c++ algorithm binary-search-tree

使用二叉搜索树我需要向树的最重路径的所有int元素添加一个向量。 例如我有20,7,6,9,11,21 应添加到矢量的值为20,7,9,11 我已经编写了最重路径计算的实现,但我不知道如何更改它,因此正确的元素将被添加到向量中:

int Tree::maxBranch(Node* node){
    if(node==NULL)
        return 0;
    int leftSum=node->data+maxBranch(node->left);
    int rightSum=node->data+maxBranch(node->right);
    if(rightSum>leftSum){
        return rightSum;
    }
    return leftSum;     
}

2 个答案:

答案 0 :(得分:2)

您编写的代码不会跟踪它所遵循的分支 - 它只能得到总和。

您应该更改函数以将std::vector<int>&作为参数(请注意&,作为参考类型,因为您需要有效地返回两个值。)

用空矢量调用它。

在您对node->left进行递归调用的行之前,您应保存原始向量,例如std::vector<int> vec_left(input_vector)std::vector<int> vec_right(input_vector)。然后将两个副本传递给递归调用。

现在,在代码中,return rightSum之前,您应该有一个vec_right.push_back(node->id); input_vector = vec_right;。在return leftSum之前,您应该有一个vec_left.push_back(node->id); input_vector = vec_left;。在英语中,你保留了具有最高总和的分支所做的路径,并丢弃了另一个路径。

答案 1 :(得分:0)

快速&amp;脏:

int Tree::maxBranch(Node* node, vector<int>& vec, bool add){
    if(node==NULL)
        return 0;
    int leftSum=node->data+maxBranch(node->left, vec, false);
    int rightSum=node->data+maxBranch(node->right, vec, false);
    if (add)
        vec.push_back(node->data);
    if(rightSum>leftSum){
        if (add)
            maxBranch(node->right, vec, true);
        return rightSum;
    }
    if (add)
        maxBranch(node->left, vec, true);
    return leftSum;     
}