Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在树中寻找最小值的路径_C++_Algorithm_Tree - Fatal编程技术网

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的两个调用都在修改同一列表,它将包含两个子树的路径。更好:),但现在您正在将列表推回到同一类型的列表上。您还需要将当前节点添加到列表中的某个位置。谢谢。这就是我需要的。