这是我的研究代码中的一个问题,我想知道这样做的有效方法是什么。我遗漏了不必要的细节,我正在以一种方式呈现它,以便能够理解问题的关键。
假设我有一个二叉树,每个节点上都有数字。我想找到树中从根到叶的所有分支的最小总和。下面是一个非常粗略的伪代码。
int minimum(tree){
// Some base cases
left_min = minimum(tree->left);
right_min= minimum(tree->right);
if (left_min < right_min){
return current_value + left_min;
}
else{
return current_value + right_min;
}
}
由此,我可以计算出最小值。但是,如果我想计算给我最小的节点,我该怎么办呢?即如果答案是14,我想知道树中每个级别的哪些节点加起来给我一个14的总和。对现有函数进行最小改动的有效方法是什么?通过最小的改变,我的意思是我可以添加额外的变量来跟踪分支,但不能完全重写函数。
由于
答案 0 :(得分:3)
您可以使用列表或堆栈或队列代替vector:
typedef vector<yourIdType> idvec;
int minimum(tree, idvec &path){
// Some base cases
idvec leftPath, rightPath;
left_min = minimum(tree->left, leftPath);
right_min= minimum(tree->right, rightPath);
if (left_min < right_min){
swap(path, leftPath);
path.push_back(thisNodeId);
return current_value + left_min;
} else {
swap(path, rightPath);
path.push_back(thisNodeId);
return current_value + right_min;
}
}
答案 1 :(得分:2)
您可以使用列表/队列作为额外参数来跟踪所选节点:
int minimum(tree, list){
List templeft, tempright;
// Some base cases
left_min = minimum(tree->left, templeft);
right_min= minimum(tree->right, tempright);
if (left_min < right_min){
list.push_back(templeft);
list.push_back(current);
return current_value + left_min;
}
else{
list.push_back(tempright);
list.push_back(current);
return current_value + right_min;
}
}