【已知中序后序二叉树求前序二叉树】

int InOrder[1000], PosterOrder[1000];
typedef struct BiTNode {
    int data;
    struct BiTNode *LChild, *RChild;
} BiTNode, *BiTree;
int find(int *InOrder, int &x, int n) {
    for(int i = 0; i< n; ++i) {if(InOrder[i] == x) return i;}
    return -1;
}
void PreOrderTraverse(BiTree T, int n) {
    if(T == NULL) return ;
    printf("%d ", T -> data);
    PreOrderTraverse(T -> LChild, n);
    PreOrderTraverse(T -> RChild, n);
}
BiTNode *CreateInTree(int *PosterOrder, int *InOrder, int n) {
    BiTNode *in;
    if(PosterOrder == NULL || InOrder == NULL || n ==0) return NULL;
    else {
        in = (BiTNode *)malloc(sizeof(BiTNode));
        in -> data = PosterOrder[n - 1];
        int i = find(InOrder, PosterOrder[n - 1], n);
        if(i != -1) {
            in -> LChild = CreateInTree(PosterOrder, InOrder, i);
            in -> RChild = CreateInTree(PosterOrder + i, InOrder + i + 1, n - i - 1);
            return in;
        }
        return NULL;
    }
}
void destoryBiTree(BiTree &T) {
    if(T == NULL) return ;
    destoryBiTree(T -> LChild);
    destoryBiTree(T -> RChild);
    free(T);
    T = NULL;
}
int main(int argc, char *argv[])
{
    BiTree T;
    int n, i;
    while(scanf("%d", &n) != EOF) {
        for(i = 0; i < n; i++) scanf("%d", &PosterOrder[i]);
        for(i = 0; i < n; i++) scanf("%d", &InOrder[i]);
        T = CreateInTree(PosterOrder, InOrder, n);
        PreOrderTraverse(T, n);
        destoryBiTree(T);
        puts("");
    }
    return 0;
}
7
3 1 2 5 6 7 4
3 2 1 4 5 7 6

4 2 3 1 7 5 6
时间: 2024-11-05 11:31:07

【已知中序后序二叉树求前序二叉树】的相关文章

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

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

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

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

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

void solve(int start,int end,int root) { // 前序和中序 -> 后序 // 每次调用solve()函数,传入pre-order的start,end,root if (start > end) // 递归边界 return; int i = start; while (i < end && in.at(i) != pre.at(root)) // 找到左右子树的分割点 i++; solve(start, i - 1, root +

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

前面已经介绍过三种遍历方法的规则,为了大家看着方便,这里我们在重新介绍一遍: 1.先序遍历 (1)访问根结点: (2)先序遍历左子树: (3)先序遍历右子树.  2.中序遍历 (1)中序遍历左子树: (2)访问根结点: (3)中序遍历右子树. 3.后序遍历 (1)后序遍历左子树: (2)后序遍历右子树: (3)访问根结点. 知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知中序和后序遍历序列,求先序遍历序列. 已知该二叉树的中序

SDUT 1489 求二叉树的先序遍历 (中序后序还原二叉树)

求二叉树的先序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历 Input 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据.每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的中序遍历序列,第二个字符串表示二叉树的后序遍历序列. Output 输出二叉树的先序遍历序列 Exampl

二叉树知道前序中序或者中序后序求另外一个排列

二叉树的遍历: 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍历:左子树->右子树->根节点 求下面树的三种遍历: 前序遍历:abdefgc 中序遍历:debgfac 后序遍历:edgfbca 详细的二叉树的操作可以看一下我之前写的文章 二叉树java 已知前序.中序遍历,求后序遍历 前序遍历的第一个值就是根节点,然后再中序遍历中找到这个值,那么这个值的左边部分即为当前二叉树的左子树部分前序遍历结果,这个值的右边部分即为当前二叉树的右

已知先序后序构造二叉树

已知二叉树先序后序的基础上,可以构造出不唯一的二叉树集.主要思路如下: 先序遍历中刚遍历到的下一个节点是后序遍历中最后遍历的节点,所以可以将后序遍历拆分成两个子序列,从而进行递归构造. 例如 先序遍历为aebdc,后序遍历为bcdea. 首先可以确定根节点为a,在后序中找先序的下一个节点(也就是e),将原序列拆分成两部分,其左子树包含的元素有bcde,右子树为空. 接着在bcd中寻找先序中e的后一个元素即b的位置,将这个子序列又拆分成了b和cd两部分.如此递归下去就能得到一种可能的二叉树.

二叉树的前序中序后序遍历相互求法

二叉树的前中后序遍历,他们的递归非递归.还有广度遍历,参见二叉树的前中后序遍历迭代&广度遍历和二叉树的前中后序遍历简单的递归 现在记录已知二叉树的前序中序后序遍历的两个,求另外一个.一般,这两个中一定有中序遍历. 1.已知前序和中序,求后序遍历: 前序:ABDECFG  中序:DBEAFCG 思路简单:前序的第一个节点就是根节点, 中序中找到根节点的位置,根节点之前是其左子树,之后是右子树   按此顺序,依次在左子树部分遍历,右子树部分遍历 C++ 代码: TreeNode *BinaryTre

紫书p155 用中序后序构造二叉树

二叉树各节点权值是不相同的正整数,输入二叉树的中序后序,求到根节点权和最小的叶节点 紫书贼强,递归写的服气,慢慢理解吧 原文是建树之后用dfs搜的,我试着一边建树一边归纳最短路径 #include<bits/stdc++.h> using namespace std; const int maxv = 10010; int in[maxv], post[maxv], lch[maxv], rch[maxv];//中序,后序,左子树,右子树 int n, minnum, minsum; bool