使用二叉搜索树我需要向树的最重路径的所有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;
}
答案 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;
}