二叉树遍历 ——已知后序,中序求层序 A1020.(25)

若直接DFS递归求解,会栈溢出

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=50;
struct node{
    int data;
    node* lchild;
    node* rchild;
};
int pre[maxn],in[maxn],post[maxn];//先序,中序,后序
int n; //结点个数
//当前二叉树的后续序列区间为[postL,postR],中序序列区间为[inL,inR]
//create函数返回构建出的二叉树的根节点地址
node* create(int postL,int postR,int inL,int inR){
    if(postL>postR){
        return NULL;//后序序列长度小于等于0时,直接返回
    }
    node* root=new node;//新建一个新的结点,用来存放当前二叉树的根节点
    root->data=post[postR];
    int k;
    for(k=inL;k<=inR;k++){
        if(in[k]==post[postR]){//在中序遍历中找到等于根节点指向的data
            break;
        }
    }
    int numLeft=k-inL;//左子树的节点个数
    //返回左子树的根节点地址,赋值给root的左指针
    root->lchild=create(postL,postL+numLeft-1,inL,k-1);
    //返回右子树的根节点地址,赋值给root的右指针
    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);//访问队首元素的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;
} 

原文地址:https://www.cnblogs.com/JasonPeng1/p/12227156.html

时间: 2024-10-03 04:17:27

二叉树遍历 ——已知后序,中序求层序 A1020.(25)的相关文章

二叉树遍历 已知中序后序遍历求前序遍历

已知中序.后序遍历求前序遍历的方法和已知前序.中序遍历求后序遍历的方法类似寻找根节点, 然后把中序遍历分成左右两个子树,有如此不断递归.很多文章介绍,不再累述. #include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std; const int MAXN = 100; struct Node { char value; Node *l

【Tree】已知前序和中序遍历还原二叉树

1 /************************** 2 https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 3 @date 2015.5.16 4 @description 5 根据前序和中序遍历,重构二叉树 6 可用迭代,也可以使用递归. 7 递归前面已经写过,耗时,这里再次做使用迭代. 8 9 @tags tree, array, depth-first se

HDU 1710 二叉树遍历,输入前、中序求后序

1.HDU  1710  Binary Tree Traversals 2.链接:http://acm.hust.edu.cn/vjudge/problem/33792 3.总结:记录下根结点,再拆分左右子树,一直搜下去.感觉像dfs. 题意:二叉树,输入前.中序求后序. (1)建立出一颗二叉树,更直观.但那些指针用法并不是很懂. #include<iostream> #include<cstdio> #include<cstdlib> using namespace

HLG2040二叉树遍历已知前中,求后

二叉树的遍历 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 60(34 users) Total Accepted: 34(30 users) Rating: Special Judge: No Description 给出一棵二叉树的中序和前序遍历,输出它的后序遍历. Input 本题有多组数据,输入处理到文件结束. 每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点. 接下来的一行每行包括n个整数,表示这棵树的中序遍

已知前序和中序求后序,已知中序和后序求先序。

原文地址:https://www.cnblogs.com/mznsndy/p/11725452.html

关于二叉树的问题1-已知前序,中序求后序遍历

对于一棵二叉树而言,可以由其前序和中序或者中序和后序的遍历序列,确定一棵二叉树. 那么对于已知前序和中序序列,求后序序列也就是先还原二叉树,然后对其进行后序遍历即可. 二叉树结点的结构定义如下: struct TreeNode { char value; TreeNode *leftChild; TreeNode *rightChild; }; 实现代码如下: #include <stdio.h> #include <string.h> #include <stdlib.h&

数据结构已知后序和中序画出该树

已知二叉树后序遍历序列是DBCEFGHA,中序遍历序列EDCBAHFG,它的前序遍历的序列是?麻烦再画下这二叉树. 后续遍历的顺序是左右根,中序遍历的顺序是左根右 这点应该懂吧 由后续访问序列可以看出最后一个被访问的必定是这个树的根 而中序遍历的序列可以看出,一棵树当根确定后,在根前面被访问的是他的左子树,后边的是他的右子树元素 弄懂了上边两点就开始做题吧 由后序遍历序列是DBCEFGHA 为了方便,我写小写字母了啊 可以看出整棵树的根节点是a 再看中序遍历序列EDCBAHFG a是根节点 左子

数据结构——已知先序中序求后序,已知中序后序求先序

总结下二叉树的已知两种遍历方式求第三种遍历顺序的方法,已知先序和中序遍历或者后序与中序遍历后二叉树是唯一确定的,下面介绍怎么求出第三种遍历顺序. 先序遍历顺序为:根结点——左子结点——右子结点,中序遍历为:左子结点——根结点——右子结点,我们注意到,先序遍历的第一个元素就是二叉树根结点,我们在中序遍历中以该元素分为左右两部分,则左边为左子树,右边为右子树,递归即可还原二叉树,这个过程中可直接输出后序遍历的顺序.同理,可以用后序与中序还原出先序遍历的顺序. 代码及测试数据如下: 1 #includ

二叉树的遍历方法之层序-先序-中序-后序遍历的简单讲解和代码示例

二叉树的基础性质及二叉树的建立参见前面两篇博文: http://blog.csdn.net/why850901938/article/details/51052936 http://blog.csdn.net/why850901938/article/details/51052156 首先为了讲解方便,我建立了如图所示的二叉树: 取名为:树A 1.何为层序遍历? 层序遍历就是按照二叉树的层次由上到下的进行遍历,每一层要求访问的顺序为从左到右: 以树A为例,层序遍历得到的结果为: 5 2 6 1