基礎問題の練習——二叉木とある値の経路
タイトルの説明:
ツリーと整数を入力し、ツリー内のノード値と入力整数のすべてのパスを印刷します.パスは、ツリーのルートノードからリーフノードまで続くノードがパスを形成するように定義されます.
入力:
各テストケースには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行を占めるように出力し、次に条件を満たすすべてのパスを辞書順に出力します.これらのパスはノード番号で構成され、出力フォーマットは出力サンプルを参照します.
サンプル入力:
サンプル出力:
ツリーと整数を入力し、ツリー内のノード値と入力整数のすべてのパスを印刷します.パスは、ツリーのルートノードからリーフノードまで続くノードがパスを形成するように定義されます.
入力:
各テストケースには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
****************************************************************/