备战快速复习--day5

树的遍历,在构造树的过程中,多个孩子用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;
}
View Code

 借着这个输入格式实现了一下先根遍历和层次遍历。这个因为存在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;
}
View Code

猜你喜欢

转载自www.cnblogs.com/tingxilin/p/12340995.html