C++ 在树中寻找最小值的路径
这是我研究代码中的一个问题,我想知道做这件事的有效方法是什么。我省略了不必要的细节,并且以一种能够理解问题症结的方式来陈述 假设我有一个二叉树,每个节点上都有数字。我想找到树上从根到叶的所有分支的最小和。下面是一个非常粗略的伪代码C++ 在树中寻找最小值的路径,c++,algorithm,tree,C++,Algorithm,Tree,这是我研究代码中的一个问题,我想知道做这件事的有效方法是什么。我省略了不必要的细节,并且以一种能够理解问题症结的方式来陈述 假设我有一个二叉树,每个节点上都有数字。我想找到树上从根到叶的所有分支的最小和。下面是一个非常粗略的伪代码 int minimum(tree){ // Some base cases left_min = minimum(tree->left); right_min= minimum(tree->right); if (left_min
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;
}
}
int最小值(树){
//一些基本情况
左最小=最小值(树->左);
右\最小=最小值(树->右);
如果(左最小<右最小){
返回当前值+左最小值;
}
否则{
返回当前值+右最小值;
}
}
由此,我可以计算出最小值。然而,如果我想计算得到最小值的节点,我该怎么做呢?i、 e.如果答案是14,我想找出树中每一级的哪些节点加起来,得到14的总和。在对现有功能进行最小更改的情况下,进行此操作的有效方法是什么?通过最小更改,我的意思是我可以添加额外的变量来跟踪分支,但不能完全重写函数
谢谢您可以使用列表/队列作为额外参数来跟踪所选节点:
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;
}
}
int最小值(树,列表){
列表templeft,tempright;
//一些基本情况
左最小=最小值(树->左,模板左);
右\最小值=最小值(树->右,右);
如果(左最小<右最小){
列表。推回(templeft);
列表。推回(当前);
返回当前值+左最小值;
}
否则{
列表。向后推_(右);
列表。推回(当前);
返回当前值+右最小值;
}
}
您可以使用列表、堆栈或队列而不是向量:
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;
}
}
typedef向量idvec;
最小整数(树、idvec和路径){
//一些基本情况
idvec leftPath,rightPath;
left_min=最小值(树->左,左路径);
右\最小=最小值(树->右,右路径);
如果(左最小<右最小){
交换(路径,左路径);
路径。推回(thisNodeId);
返回当前值+左最小值;
}否则{
交换(路径,右路径);
路径。推回(thisNodeId);
返回当前值+右最小值;
}
}
您的树是否有父链接?或者只有left
和right
链接?本质上是正确的,但需要注意的是,列表应作为引用类型传递。这不起作用,对minimum的两个调用都在修改同一列表,它将包含两个子树的路径。更好:),但现在您正在将列表推回到同一类型的列表上。您还需要将当前节点添加到列表中的某个位置。谢谢。这就是我需要的。