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); }