很简单的一道题目,注意对二叉树的深度分析一下,把数组开大点,前序中序求这个树,我用数组静态做的,有点像是线段树的构造过程,数据也没夸张到需要动态分配内存,不过后边的反转二叉树又让我想到了那个梗,蛤蛤蛤蛤。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn=1000000; int n,num(0); int pre[maxn],in[maxn],tree[maxn]; void build(int tag,int left,int right) { tree[tag]=pre[++num]; if(left==right) return; int index=-1; for(int i=left;i<=right;i++) { if(in[i]==tree[tag]) { index=i; break; } } if(index==-1) return; if(index-1>=left) build(tag<<1,left,index-1); if(index+1<=right) build(tag<<1|1,index+1,right); } void bfs() { queue<int> que; que.push(1); int tag=tree[1]; while(!que.empty()) { int temp=que.front(); que.pop(); if(tree[temp]!=tag) printf(" "); printf("%d",tree[temp]); if(tree[temp*2+1]!=0) que.push(temp*2+1); if(tree[temp*2]!=0) que.push(temp*2); } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&in[i]); for(int i=1;i<=n;i++) scanf("%d",&pre[i]); build(1,1,n); bfs(); printf("\n"); return 0; }
时间: 2024-10-11 16:42:43