【二叉树】通过后序中序求层序

5 篇文章 0 订阅

题目

给出一棵二叉树的后序遍历和中序遍历,求这棵二叉树的层序遍历序列。

输入

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出

4 1 6 3 5 7 2

代码

#include <cstdio>
#include <queue>
using namespace std;
const int maxn = 100;

int pro[maxn],in[maxn]; //pro后序,in中序 
int n; //结点个数 

struct Node{
 int data;
 Node *lchild,*rchild;
}; //结点 

//通过后序和中序求二叉树 
Node *create(int proL,int proR,int inL,int inR){
 //后序区间[proL,proR],中序区间[inL,inR] 
 int k,numLeft; //k为当前根结点在中序中的位置 
 if(proL > proR){  //结点数小于等于0 
  return NULL;
 }
 Node *root = new Node; //建立一个新结点为根结点 
 root->data = pro[proR]; //根结点为后序最后一个结点 
 for(k = inL; k <= inR; k++){
  if(in[k] == pro[proR])  //找到根结点在中序中的位置 
   break;
 }
 numLeft = k - inL; //当前左子树的个数 
 //左子树后序[proL,proL + numLeft - 1],中序[inL,k - 1]
 root->lchild = create(proL, proL + numLeft - 1, inL, k - 1);
 //右子树后序[proL + numLeft,proR - 1],中序[k + 1,inR] 
 root->rchild = create(proL + numLeft, proR - 1, k + 1, inR);
 return root; //返回当前根结点 
}

int num = 0;//已经输出的结点个数
//BFS求层序序列
void BFS(Node *root){
 queue<Node*> Q;  //建立一个队列 
 Q.push(root);  //将根结点入队列 
 while(!Q.empty()){  
  Node *now = Q.front(); //取出队首 
  Q.pop();
  printf("%d", now->data); //输出队首值 
  num++;  //计数变量加1 
  if(num < n){ //序列未输出结束则输出一个空格 
   printf(" ");
  }
  if(now->lchild != NULL) Q.push(now->lchild); //左子树非空则将左子树入队列 
  if(now->rchild != NULL) Q.push(now->rchild); //右子树非空则将右子树入队列 
 }
}

int main(int argc, char** argv) {
 int i;
 scanf("%d",&n); //输入结点个数 
 for(i = 0; i < n; i++){
  scanf("%d",&pro[i]); //输入后序序列 
 }
 for(i = 0; i < n; i++){
  scanf("%d",&in[i]); //输入中序序列 
 }
 Node *root = create(0, n-1, 0, n-1); //求二叉树 
 BFS(root);  //层序遍历输出 
 printf("\n"); 
 return 0;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值