1. 程式人生 > 實用技巧 >A 1020 Tree Traversals (25分) 題型: 二叉樹的遍歷 之 由後序和中序得到層次遍歷

A 1020 Tree Traversals (25分) 題型: 二叉樹的遍歷 之 由後序和中序得到層次遍歷

二叉樹的遍歷 題型

此類題做法

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,int
inR) { 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; }