基礎問題の練習——二叉木とある値の経路


タイトルの説明:
ツリーと整数を入力し、ツリー内のノード値と入力整数のすべてのパスを印刷します.パスは、ツリーのルートノードからリーフノードまで続くノードがパスを形成するように定義されます.
入力:
各テストケースにはn+1行が含まれます.
第1の動作は2つの整数n,k(1<=n<=10000)であり、nはノードの個数を表し、kは所望の経路和を表し、ノード番号は1からnである.                                                                                                       
次はn行あります.このn行の動作ごとに3つの整数vi,leftnode,rightnode,viはi番目のノードの値を表し,leftnodeはi番目のノードの左の子供のノード番号を表し,rightnodeはi番目のノードの右の子供のノード番号を表し,ノード値がなければ−1である.番号1のノードはルートノードです.
出力:
各テストケースに対応して、「result:」が1行を占めるように出力し、次に条件を満たすすべてのパスを辞書順に出力します.これらのパスはノード番号で構成され、出力フォーマットは出力サンプルを参照します.
サンプル入力:
5 2210 2 35 4 512 -1 -14 -1 -17 -1 -11 51 -1 -1

サンプル出力:
result:A path is found: 1 2 5A path is found: 1 3result:
  :         ,             ,         (        ,       ,          )
            ,                  <  ,                          ,         ,         (               )
                    id               
 
 
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
 
struct TreeNode
{
    int val;
    int lChildId;
    int rChildId;
    TreeNode()
    {
        lChildId=rChildId=-1;
    }
};
 
TreeNode treeInfo[10001];
int Route[10000];
 
void FindSumKRoute(int rootPos,int n, int curSum, int k, int* route,int length)
{
    if(rootPos>n)//error
        return;
    if(rootPos==-1)
    {
        return;
    }
    curSum+=treeInfo[rootPos].val;
    route[length]=rootPos;
    if(-1==treeInfo[rootPos].lChildId && -1==treeInfo[rootPos].rChildId)
    {
        if(curSum == k)
        {   
            cout<<"A path is found:";
            for(int i=0; i<=length; i++)
                cout<<" "<<route[i];
            cout<<endl;
        }
        return;
    }
    FindSumKRoute(treeInfo[rootPos].lChildId,n,curSum,k,route,length+1);
    FindSumKRoute(treeInfo[rootPos].rChildId,n,curSum,k,route,length+1);
    return;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int n,k;
    while (cin>>n>>k)
    {
        for(int i=1; i<=n; i++)
        {
            int val,l,r;
            scanf("%d%d%d",&val,&l,&r);
            //cin>>val>>l>>r;
            treeInfo[i].val=val;
            if(l<r)  //vital, not point input satisfy left < right
                treeInfo[i].lChildId=l,treeInfo[i].rChildId=r;
            else
                treeInfo[i].lChildId=r,treeInfo[i].rChildId=l;
        }
        cout<<"result:"<<endl;
        FindSumKRoute(1,n,0,k,Route,0);
         
    }
    return 0;
}
/**************************************************************
    Problem: 1368
    User: xjbscut
    Language: C++
    Result: Accepted
    Time:150 ms
    Memory:1668 kb
****************************************************************/