1. 程式人生 > 實用技巧 >2020.11 程式設計天梯賽 L2-3 完全二叉樹的層序遍歷 (25分)

2020.11 程式設計天梯賽 L2-3 完全二叉樹的層序遍歷 (25分)

L2-3 完全二叉樹的層序遍歷 (25分)

題意:給出一棵完全二叉樹的後序遍歷,輸出對應層序遍歷。

思路:對於給定的後序遍歷序列,可以知道最後一個元素是樹的根節點,可以使用遞迴建樹。

1.若當前結點的右子樹不為空則繼續將右子樹遍歷,若右子樹為空則判斷當前結點是否存在右兒子,右兒子的編號為 this.num*2+1,如果右兒子的編號小於等於結點的數量n則表示存在右兒子,在此新建結點。

2.若右子樹不滿足條件則考慮左子樹,同樣是假如當前結點的左子樹不為空則繼續向左子樹遍歷,否則判斷當前結點是否存在左兒子,左兒子的編號為 this.num*2,如果左兒子的編號小於等於結點的數量n則表示存在左兒子,在此新建結點。

3.使用佇列實現層序遍歷。

程式碼:

#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <algorithm>
//#include <unordered_map>
#define INF 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define FILL(a,n,v) fill(a,a+n,v)
#define Mset(a,v) memset(a,v,sizeof a)
#define Mcpy(a,b) memcpy(a,b,sizeof b) //a=b
#define fcio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define fcin freopen("in.txt","r",stdin)
#define fcout freopen("out.txt","w",stdout)
#define mian main
#define ture true
#define esle else
#define falg flag
using namespace std;
int n;
int a[35];

struct node
{
    int value;
    int level;
    node* l;
    node* r;

    node(int value)
    {
        this->value=value;
        this->l=NULL;
        this->r=NULL;
        this->level=1;
    }
};

bool flag;
void build(node* root,int a,int num)
{
    if(flag) return ;

    if(root->r) build(root->r,a,num*2+1);
    else if(num*2+1<=n)
    {
        flag=true;
        root->r=new node(a);
        return;
    }

    if(flag) return ;

    if(root->l) build(root->l,a,num*2);
    else if(num*2<=n)
    {
        flag=true;
        root->l=new node(a);
        return;
    }
}

int res[50];
int cnt=0;

void levelOrder(node* root)
{
    queue<node*>q;
    node* now=root;
    q.push(now);
    
    while(q.size())
    {
        now=q.front();
        res[cnt++]=now->value;
        q.pop();
        if(now->l) q.push(now->l);
        if(now->r) q.push(now->r);
    }
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    reverse(a+1,a+n+1);

    node* root=new node(a[1]);

    for(int i=2;i<=n;i++)
    {
        flag=false;
        build(root,a[i],1);
    }
    levelOrder(root);
    for(int i=0;i<cnt;i++)
    {
        cout<<res[i]<<(i==n-1?'\n':' ');
    }
}