如何停止递归?

时间:2013-05-23 12:33:42

标签: c++ data-structures recursion

下面的代码是to find the path in a tree that adds up to a given sum ...我在这里做的是将enqueue所有节点的值转换为数组path并在条件满足递归时打印.... / p>

void checkSum(NODE* root, int path[], int len, int sum){

     if(root == NULL) return;

     path[len] = root->data;
     len++;

     if(sum - root->data == 0){ 
            sum -= root->data;
            cout<<"\nSum equals..."; 
            printPaths(path, len); 
     }
     else if(sum - root->data > 0){
          sum -= root->data;
          checkSum(root->left, path, len, sum);    
          checkSum(root->right, path, len, sum);
     }else { return; }
}

我想知道的是,有没有其他方法可以在不使用任何数据结构的情况下打印路径(至少一个)???

有点喜欢这个......

void checkSum_second(NODE* root, int sum){

     if(root == NULL) return;

     if(sum - root->data == 0) {  
          //do something
     }     
     else if(sum - root->data > 0){
          sum -= root->data;                 
     }else return;


     checkSum_second(root->left, sum);
     checkSum_second(root->right, sum);     
     cout<<"\nvalue..."<<root->data;
}

考虑像

这样的树
           1
       2       3
    4    5   6   7

如果sum = 7执行checkSum_second(root->left, sum);三次,直到节点4,这里是否可以停止所有内容并打印堆栈(即清空它)....

3 个答案:

答案 0 :(得分:3)

要尽早终止递归,您需要在调用链上传递某种信号。在您的情况下,您可以将返回类型更改为bool,并返回true以指示搜索已终止,并且无需进一步处理:

bool checkSum(NODE* root, int path[], int len, int sum) {
     if(root == NULL) return false;
     path[len] = root->data;
     len++;
     if (sum - root->data == 0){ 
          sum -= root->data;
          cout<<"\nSum equals..."; 
          printPaths(path, len);
          return true;
     } else if (sum - root->data > 0) {
          sum -= root->data;
          if (checkSum(root->left, path, len, sum)) {
              return true;
          }
          if (checkSum(root->right, path, len, sum)) {
              return true;
          }
     }
     return false;
}

请注意,在上面的代码中,递归调用仅在先前的调用继续返回false时继续。从调用返回的第一个true将在调用链中向上发送,从而导致整个调用链终止。

答案 1 :(得分:0)

如果您不想保存路径,在到达您的号码(7)后,向上移动图表并在途中打印每个点头。

编辑:这是关于如何执行此操作的代码 请注意,这将:

  1. 自下而上打印路径
  2. 打印所有可能的路径
  3. 这是代码

    void checkSum_second(NODE* originalRoot, NODE* root, int sum){
    
     if(root == NULL) return;
    
     if(sum - root->data == 0) { 
          //do something 
          NODE* tmp = root;
          while (tmp != originalRoot) {
               print(tmp->data);
               tmp = tmp->parent;
          }
     }     
     else if(sum - root->data > 0){
          sum -= root->data;                 
     }else return;
    
    
     checkSum_second(originalRoot,root->left, sum);
     checkSum_second(originalRoot,root->right, sum);     
     cout<<"\nvalue..."<<root->data;
    

    }

答案 2 :(得分:0)

这应该颠倒打印,但如果您不想要数据结构,我认为还有另一种方式。

找到路径后返回true

void checkSum_second(NODE* root, int sum){
     if(root == NULL) return false;

     if(sum - root->data == 0)
     {
          cout<<"\nvalue..."<<root->data;
          return true;
     }
     else if(sum - root->data > 0)
          sum -= root->data;
     else return false;

     // if first is true, second won't get evaluated (it's the way || works)
     // if we found a path, print the current node and return true
     if (checkSum_second(root->left, sum) ||
         checkSum_second(root->right, sum))
     {
       cout<<"\nvalue..."<<root->data;
       return true;
     }
     return false;
}