A 1020 Tree Traversals (25分) 題型: 二叉樹的遍歷 之 由後序和中序得到層次遍歷
阿新 • • 發佈:2020-07-21
二叉樹的遍歷 題型
此類題做法
1.定義節點
2.構造二叉樹{
a.邊界條件
b.建立新節點root
存入根節點資料(由後序或先序
c. k 遍歷中序,找到相等的值
d. 得出左子樹個數(中序的 )
e.返回左子樹根節點地址,返回右子樹根節點地址,return root;
3.層次遍歷{
a.建立佇列,queue
b.把root進隊 q.push(root)(這是所有的root。。???)
c.輸出層次遍歷資料{
判空-》取出首元素-》清空佇列(防止超時)-》printf元素,-》判斷左子樹空或插入,右子樹空或插入
#include<cstdio> #include<queue> //#include<cstring> //#include<algorithm> using namespace std; const int maxn=50; struct node{ int data; node* lchild; node* rchild; }; int pre[maxn],post[maxn],in[maxn]; int n; node* create(int postL,int postR,int inL,intinR) { if(postL>postR){ return NULL; } node* root =new node;//申請一個node型變數空間 root->data=post[postR]; int k; for(k=inL;k<=inR;k++)//遍歷,從左到右邊的值 { if(in[k]==post[postR]) break; } int numLeft=k-inL; root->lchild=create(postL,postL+numLeft-1,inL,k-1); root->rchild=create(postL+numLeft,postR-1,k+1,inR); return root; } int num=0; void BFS(node* root) { queue<node*> q; q.push(root); while(!q.empty()){ node* now=q.front(); q.pop(); printf("%d",now->data); num++; if(num<n) printf(" "); if(now->lchild!=NULL) q.push(now->lchild); if(now->rchild!=NULL) q.push(now->rchild); } } int main() { scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&post[i]); } for(int i=0;i<n;i++){ scanf("%d",&in[i]); } node* root =create(0,n-1,0,n-1); BFS(root); return 0; }