和之前的一篇分析的结果一样,当需要枚举可能性的时候,使用DFS的方法进行搜索
然后采用回溯的方法进行节点的输出。
本题值得注意的两点是
1:必须是叶子节点,中间节点不可以
2:因为是有序的输出,所以,把节点交换一下,使得左子树小于又子树
#include <stdio.h> #include <vector> using namespace std; struct Node { int value,lchild,rchild; }nodes[10010]; vector<int> result; void dfs(int count,int sum,int i) { if(i==-1) return ; if(sum==count+nodes[i].value&&nodes[i].lchild==-1&&nodes[i].rchild==-1) { result.push_back(i); printf("A path is found:"); for(int j=0;j<result.size();j++) printf(" %d",result[j]); printf("\n"); result.pop_back(); return; } if(sum>count+nodes[i].value) { result.push_back(i); dfs(count+nodes[i].value,sum,nodes[i].lchild); dfs(count+nodes[i].value,sum,nodes[i].rchild); result.pop_back(); } } int main() { int num,sum; //freopen("data.in","r",stdin); while(scanf("%d%d",&num,&sum)!=EOF) { result.clear(); for(int i=1;i<=num;i++) { scanf("%d%d%d",&nodes[i].value,&nodes[i].lchild,&nodes[i].rchild); if(nodes[i].lchild>nodes[i].rchild) { int tmp=nodes[i].lchild; nodes[i].lchild=nodes[i].rchild; nodes[i].rchild=tmp; } } printf("result:\n"); dfs(0,sum,1); } return 0; } /************************************************************** Problem: 1368 User: vincent_ynh Language: C++ Result: Accepted Time:30 ms Memory:1140 kb ****************************************************************/