臭道人

2.7

https://pintia.cn/problem-sets/16/problems/666

建树和输出叶结点  一刷

尝试用向量解决

尝试用队列解决

把收藏夹里这个题的几个链接搞完

#include<iostream>
#include<algorithm>
using namespace std;
struct node{
    int a;
    int b;
}t[12];
int build(struct node t[],int n)
{
    int root=-1,check[12]={0},i;
    if(n)
    {
        for(i=0;i<n;i++)
        {
        char c1,c2;
        cin>>c1>>c2;
        if(c1!='-')
        {
            t[i].a=c1-48;
            check[t[i].a]=1;
        }
        else t[i].a=-1;
        if(c2!='-')
        {
            t[i].b=c2-48;
            check[t[i].b]=1;
        }
        else t[i].b=-1;
        }
        for(i=0;i<n;i++)
            if(!check[i])break;
        root = i;
    }
    return root; 
}
void level(struct node t[],int r)
{
    int in=0,out=0,b[100],cnt=0;
    b[in++]=r;
    while(in>out)
    {
        if(t[b[out]].a==-1&&t[b[out]].b==-1)
            {
            if(!cnt++)    printf("%d",b[out]);
            else printf(" %d",b[out]);}
        if(t[b[out]].a!=-1)    b[in++]=t[b[out]].a;
        if(t[b[out]].b!=-1)    b[in++]=t[b[out]].b;
        out++;
    }
}
int main()
{    
    int n;cin>>n;
    int r=build(t,n);
    level(t,r);
}

 

https://pintia.cn/problem-sets/994805342720868352/problems/994805380754817024

很有趣的题,给定 前序中序,恢复后序

和这个题相似:

 

目前零刷,我看柳神的解

#include <cstdio>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;
vector<int> pre, in, post,value;
void postorder(int root, int start, int end) {    //root是前序里面的 
    if (start > end) return;
    int i = start;
    while (i < end && in[i] != pre[root]) i++;
    postorder(root + 1, start, i - 1);//左子树 
    postorder(root + 1 + i - start, i + 1, end);//右子树,i-start是区间长
    //         这两处为什么不同(为什么不都是i+1):因为第一个参数是在pre里面,而第二个参数是在in里面 
    post.push_back(pre[root]);
}
int main() {
    int n;
    scanf("%d", &n);
    char str[5];
    stack<int> s;
    int key=0;
    while (~scanf("%s", str)) {
        if (strlen(str) == 4) {//push 
            int num;
            scanf("%d", &num);
            value.push_back(num);
            pre.push_back(key);//key对应的是下标 
            s.push(key++);//都是下标运算,入栈是前序遍历 
        } else {
            in.push_back(s.top());
            s.pop();//出栈是中序遍历 
        }
    }
    postorder(0, 0, n - 1);//value里面存的是键值 
    printf("%d", value[post[0]]);//为了控制格式 
    for (int i = 1; i < n; i++)
        printf(" %d",value[post[i]]);
    return 0;
}

 

 别人解法

#include<bits/stdc++.h>
using namespace std;
int n,x,flag;
vector<int>in,pre;
char str[5];
stack<int>s;
void post(int root,int start,int end)
{
    if(start>end)    return ;
    int i=start;
    while(i<=end&&in[i]!=pre[root])    i++;
    post(root+1,start,i-1);
    post(root+1+i-start,i+1,end);
    if(flag)    cout<<" "<<pre[root];
    else    {cout<<pre[root];    flag=1;}
}
int main()
{
    cin>>n;
    for(int i=0;i<2*n;i++)
    {
        cin>>str;
        if(!strcmp("Push",str))
        {
            cin>>x;
            s.push(x);
            pre.push_back(x);
        }
        else
        {
            in.push_back(s.top());
            s.pop();
        }
    }
    post(0,0,n-1);
}
View Code

 

posted on 2021-02-07 02:07  臭总  阅读(221)  评论(0编辑  收藏  举报

导航