1020 Tree Traversals + L2-011 玩转二叉树 [二叉树遍历]
题目大意就是根据树的后序遍历和中序遍历推出层序遍历。
很久没做过这种题了,正好借此复习一下数据结构。
首先是遍历的几个简单介绍。
前序遍历(preorder):根结点->左子树->右子树。
中序遍历(inorder):左子树->根结点->右子树。
后序遍历(postorder):左子树->右子树->根结点。
层序遍历(level order):从根开始,依次向下,每一层从左向右遍历。
前序遍历:1 2 4 5 7 8 3 6
中序遍历:4 2 7 5 8 1 3 6
后序遍历:4 7 8 5 2 6 3 1
层次遍历:1 2 3 4 5 6 7 8
接着来讲讲后序+中序->层序or前序
我们可以根据后序遍历的最后一个点找到根节点,然后在中序遍历中找到这个根节点,在根节点左边的就是左子树,右边为右子树。进而可以在后序遍历中划出左子树和右子树。同理得到的左子树和右子树也按该方法处理,最后即可得到这棵树。
最后是代码实现。
二叉树用结构体指针处理。
上述思路用递归函数实现。每次递归更新子树的中后序遍历序列的起点和终点,返回当前树的根节点。当后序序列的长度小于零时递归结束。
层序遍历的输出用BFS输出即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <string.h> #include <cstdio> #include <string> #include <queue> using namespace std; #define maxn 35 struct node { int data; node *l; node *r; }tr[maxn]; int n; int a[maxn],b[maxn]; node* fun(int s1,int t1,int s2,int t2) { if(s1>t1) return NULL; int pos; node *root=new node; root->data=a[t1]; for(int i=s2;i<=t2;i++) { if(b[i]==a[t1]) { pos=i; break; } } int ln=pos-s2; root->l=fun(s1,s1+ln-1,s2,pos-1); root->r=fun(ln+s1,t1-1,pos+1,t2); return root; } void BFS(node *root) { int cnt=0; node *t; queue<node*> q; q.push(root); while(!q.empty()) { t=q.front(); q.pop(); printf("%d",t->data); cnt++; if(cnt<n) printf(" "); if(t->l!=NULL) q.push(t->l); if(t->r!=NULL) q.push(t->r); } printf("\n"); } int main() { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<n;i++) scanf("%d",&b[i]); node *root=fun(0,n-1,0,n-1); BFS(root); return 0; }
另一题同理
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <string.h> #include <cstdio> #include <algorithm> #include <cstdlib> #include <math.h> #include <queue> #include <vector> #define maxn 35 #define INF 0x3f3f3f3f using namespace std; typedef long long ll; struct node { int data; node *l,*r; }; int n; int in[maxn],pre[maxn]; node *build(int s1,int t1,int s2,int t2) { if(s1>t1) return NULL; node *root=new node; root->data=pre[s2]; int pos=0; for(int i=s1;i<=t1;i++) { if(root->data==in[i]) { pos=i; break; } } int ln=pos-s1; root->l=build(s1,pos-1,s2+1,s2+ln); root->r=build(pos+1,t1,s2+ln+1,t2); return root; } void print(node *root) { int cnt=0; node *t=new node; queue<node*> q; q.push(root); while(!q.empty()) { t=q.front(); q.pop(); printf("%d",t->data); cnt++; if(cnt<n) printf(" "); if(t->r!=NULL) q.push(t->r); if(t->l!=NULL) q.push(t->l); } printf("\n"); } int main() { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&in[i]); for(int i=0;i<n;i++) scanf("%d",&pre[i]); node *root=build(0,n-1,0,n-1); print(root); return 0; }