树的遍历,在构造树的过程中,多个孩子用vector来表示,有的时候孩子需要排序
PAT A1053
dfs有权树然后输出路径权值和目标相同的,必须走到叶子节点。另外要求输出按照非降序输出(这个非降序,仅考虑A>B 在min(lena,lenb)中,第一个不等的是A[i]>B[I]),不考虑长度不同。
解题思路
这个就是正常dfs,存储当前节点和遍历情况,注意在dfs中,保存遍历的判定条件需要在dfs结束当前轮的时候修改,但是保存结果的不用修改,自动顶掉了。
还有cmp数组,这个序号是已知的,只需要对里面的孩子节点进行一下排序,并且只需要考虑大小,因为认为3 2 3 和3 2 3 4也算非降序。
#include<stdio.h> #include<iostream> #include<vector> #include<algorithm> #define maxn 100 using namespace std; int n,nonleafnum,target; int ansroute[105]; using namespace std; struct node{ int w; vector<int>child; }Node[maxn]; bool cmp(int a,int b) { return Node[a].w>Node[b].w; } void dfs(int nodenum,int sum,int num)//当前节点编号,目前总价,这是第几个节点 { if(target==sum+Node[nodenum].w && Node[nodenum].child.size()==0) { ansroute[num]=nodenum; for(int i=0;i<=num-1;i++) { printf("%d ",Node[ansroute[i]].w); } printf("%d\n",Node[ansroute[num]].w); return ; } if(Node[nodenum].child.size()==0||(sum+Node[nodenum].w>=target)) return ; ansroute[num]=nodenum; sum=sum+Node[nodenum].w; for(int i=0;i<Node[nodenum].child.size();i++) { dfs(Node[nodenum].child[i],sum,num+1); } } int main() { scanf("%d %d %d",&n,&nonleafnum,&target); for(int i=0;i<=n-1;i++) { int tempw; scanf("%d",&tempw); Node[i].child.clear(); Node[i].w=tempw; } for(int i=1;i<=nonleafnum;i++) { int temp,tempnum,tempchild; scanf("%d%d",&temp,&tempnum); for(int j=1;j<=tempnum;j++) { scanf("%d",&tempchild); Node[temp].child.push_back(tempchild); } sort(Node[temp].child.begin(),Node[temp].child.end(),cmp); } dfs(0,0,0);//当前坐标,当前已有w数值, return 0; }
借着这个输入格式实现了一下先根遍历和层次遍历。这个因为存在vector.size(),就不用NULL了,原理都差不多。
(先根遍历,是先走根节点,本质跟dfs一样,层次是bfs)
#include<stdio.h> #include<iostream> #include<vector> #include<algorithm> #define maxn 100 #include<queue> using namespace std; int n,nonleafnum,target; int ansroute[105]; using namespace std; struct node{ int w; vector<int>child; }Node[maxn]; bool cmp(int a,int b) { return Node[a].w>Node[b].w; } void preOrder(int root) { printf("%d ",Node[root].w); for(int i=0;i<Node[root].child.size();i++) preOrder(Node[root].child[i]); } void layerOrder(int root) { queue<int>q; q.push(root); while(!q.empty()) { int temp=q.front(); q.pop(); printf("%d ",Node[temp].w); for(int i=0;i<Node[temp].child.size();i++) { q.push(Node[temp].child[i]); } } } int main() { scanf("%d %d %d",&n,&nonleafnum,&target); for(int i=0;i<=n-1;i++) { int tempw; scanf("%d",&tempw); Node[i].child.clear(); Node[i].w=tempw; } for(int i=1;i<=nonleafnum;i++) { int temp,tempnum,tempchild; scanf("%d%d",&temp,&tempnum); for(int j=1;j<=tempnum;j++) { scanf("%d",&tempchild); Node[temp].child.push_back(tempchild); } } preOrder(0); printf("\n"); layerOrder(0); return 0; }