二叉树先序遍历中序遍历求后序遍历

先序遍历:根 左 右

中序遍历:左 根 右

后序遍历:左 右 根

我们可以先从先序遍历中找到根节点,由于知道了根节点那么可以依靠中序遍历找到左子树,右子树。这样再去先序遍历中找到左子树的根节点,然后再依靠中序遍历找到左子树的左子树(右子树同理)。这样层层递归就能还原二叉树。之后求出后序遍历。

感谢原博主http://www.cnblogs.com/rain-lei/p/3576796.html 一开始递归不会写,看了博主的发现其实很简单。注意还原二叉树时return root。

#include<stdio.h>
int n;
typedef struct btnode{
    int data;
    struct btnode *left;
    struct btnode *right;
}treenode;                  //定义二叉树节点
int preorder[1001];            //先序遍历
int inorder[1001];            //中序遍历  

treenode *gettree(int prel,int prer,int inl,int inr){   //根据先序中序还原二叉树
    if(prel>prer)
        return NULL;
    treenode *root;
    root=new treenode;
    root->data=preorder[prel];
    if(prel==prer){
        root->left=NULL;
        root->right=NULL;
        return root;
    }
    int temp;  //记录根节点在中序遍历中的位置
    for(int i=1;i<=inr;i++)
        if(inorder[i]==preorder[prel]){
            temp=i;
            break;
        }
    root->left=gettree(prel+1,prel+(temp-inl),inl,temp-1); //还原左子树
    root->right=gettree(prel+(temp-inl)+1,prer,temp+1,inr);//还原右子树
    return root;
}
void postorder(treenode *t){          //后序遍历二叉树
    if(t!=NULL){
        postorder(t->left);
        postorder(t->right);
        printf("%d\n",t->data);
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&preorder[i]);
    for(int i=1;i<=n;i++)
        scanf("%d",&inorder[i]);
    treenode *tree=gettree(1,n,1,n);
    postorder(tree);
}
时间: 2024-12-29 16:35:39

二叉树先序遍历中序遍历求后序遍历的相关文章

二叉树遍历 A1086.Tree Traversals Again(25) (转化为给定前序和中序列,求后序)

#include <bits/stdc++.h> #include <stdio.h> #include <stdlib.h> #include <queue> using namespace std; const int maxn = 50; struct node{ int data; node* lchild; node* rchild; }; int pre[maxn],in[maxn],post[maxn]; int n; node* create

hdu1710-Binary Tree Traversals (由二叉树的先序序列和中序序列求后序序列)

http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4210    Accepted Submission(s): 1908 Problem Description A binary tree is a

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

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

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

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

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

二叉树系列(一):已知先序遍历序列和中序遍历序列,求后序遍历序列

首先介绍一下三种遍历顺序的操作方法: 1.先序遍历 (1)访问根结点: (2)先序遍历左子树: (3)先序遍历右子树.  2.中序遍历 (1)中序遍历左子树: (2)访问根结点: (3)中序遍历右子树. 3.后序遍历 (1)后序遍历左子树: (2)后序遍历右子树: (3)访问根结点. 知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知先序和中序遍历序列,求后序遍历序列. 已知该二叉树的先序遍历序列为:A-B-D-E-G-C-F,

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

已知先序和中序遍历序列,求后序遍历序列. 已知该二叉树的先序遍历序列为:A-B-D-E-G-C-F,中序遍历序列为:D-B-G-E-A-C-F. 接下来我们就可以求出该二叉树的后序遍历序列,具体步骤如下: 第一步:先求root根节点,根据先序遍历规则我们可知root为先序遍历序列的第一个节点,因此该二叉树的root节点为A. 第二步:求root的左子树和右子树,这点我们可以从中序遍历序列中找出,位于root节点A左侧的D-B-G-E为root的左子树,位于A右侧的C-F为右子树. 第三步:求ro

已知二叉树的中序遍历和先序/后序遍历求后序/先序

已知两种遍历序列求原始二叉树 算法思想: 需要明确的前提条件 通过先序和中序可以求出原始二叉树 通过中序和后序可以求出原始二叉树 但是通过先序和后序无法还原出二叉树 换种说法: 只有通过先序中序或者后序中序才可以确定一个二叉树 先来看一个例子,已知先序遍历序列和中序遍历序列求后序遍历: 先序:ABCDEFGH 中序:BDCEAFHG 求后序: 分析:要求后序遍历序列,必须求出原始二叉树 先看先序序列A第一个出现,有先序遍历的定义可以知道A是根结点 再看中序遍历,A的左边是BDCE,而A的右边是F

已知先序遍历和中序遍历,求后序遍历

描述 先序序列{1,2,4,8,9,5,10,3,6,7};中序序列{8,4,9,2,10,5,1,6,3,7};求后序序列. 代码 class Node{ public int data; public Node left; public Node right; public Node(int data){ this.data=data; this.left=null; this.right=null; } } public class BinaryTree { private Node ro