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':' ');
    }
}





posted @ 2020-12-01 15:22  lihaji  阅读(133)  评论(0编辑  收藏  举报