前序和中序+后序和中序

/**由前序遍历和中序遍历得到层次遍历序列**/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<queue>
#include<algorithm>

using namespace std;
const int maxn=107;

int T[maxn], n;
int preorder[maxn], inorder[maxn];

void BuildTree(int root, int start, int ends, int index)
{
    int mid=start;
    if(start>ends || root>n)return;

    T[index]=preorder[root];

    while(inorder[mid]!=preorder[root] && mid<ends)
        mid++;
    BuildTree(root+1, start, mid-1, index*2);
    BuildTree(root+1+mid-start, mid+1, ends, index*2+1);
}
int main()
{
    while(~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]);
        BuildTree(1, 1, n, 1);

        for(int i=1; i<=2*n+1; i++)
        {
            if(T[i]!=0)
                printf("%d ", T[i]);
        }
        printf("\n");
    }
    return 0;
}
/*
7
4 1 3 2 6 5 7
1 2 3 4 5 6 7
*/

/**由后序遍历和中序遍历得到层次遍历序列**/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<queue>
#include<algorithm>

using namespace std;
const int maxn=107;

int T[maxn], n;
int posorder[maxn], inorder[maxn];

void  BuildTree(int root, int start, int ends, int index)
{
    if(start>ends || root>n)return;
    int mid=start;
    T[index]=posorder[root];

    while(inorder[mid]!=posorder[root] && mid<ends)
        mid++;
    BuildTree(root-1-ends+mid, start, mid-1, index*2);
    BuildTree(root-1, mid+1, ends, index*2+1);
}

int main()
{
    while(~scanf("%d", &n))
    {
        for(int i=1; i<=n; i++)
            scanf("%d", &posorder[i]);
        for(int i=1; i<=n; i++)
            scanf("%d", &inorder[i]);

        BuildTree(n, 1, n, 1);

        for(int i=1; i<=2*n+1; i++)
        {
            if(T[i]!=0)
                printf("%d ", T[i]);
        }
        printf("\n");
    }
    return 0;
}
/*
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
*/
时间: 2024-11-05 19:41:15

前序和中序+后序和中序的相关文章

算法实验-二叉树的创建和前序-中序-后序-层次 遍历

对于二叉树的创建我是利用先序遍历的序列进行创建 能够对于树节点的内容我定义为char型变量 '0'为空,即此处的节点不存在 头文件 Tree.h //链式二叉树的头文件 #pragma once #include<iostream> #include<queue> using namespace std; class BinaryTreeNode { public: char data; BinaryTreeNode *leftChild,*rightChild; BinaryTr

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

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

根据前序和中序遍历求后序 /后序和中序求前序

给出一二叉树的前序遍历的顺序和中序遍历的顺序我们可以由此得出后序遍历的顺序,根据它们的访问顺序,前序遍历的第一个结点肯定是根结点,与之对应在中序遍历找到对应的根结点的位置,那么在中序遍历中,根结点的左边的元素都属于左子树的元素,根结点右边的元素都属于右子树的元素,之后把左子树当成一个继续操作,就这样可以推出整个树,继而求出后序遍历: #include<iostream> #include<cstdlib> #include<cstring> #include<cs

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

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 +

前序中序后序遍历非递归实现

#include<iostream> #include<vector> #include<stack> #include<string> #include<algorithm> #include<numeric> using namespace std; class node{ public: int val; node* left; node* right; node():val(0),left(NULL),right(NULL){

二叉树的前序中序后序遍历顺序详解

四种遍历方式:前序.中序.后序遍历,按层遍历:所谓"前中后"是以根节点的遍历顺序的位置说的. 前序:根节点-左节点-右节点 中序:左节点-根节点-右节点 后序:左节点-右节点-根节点 遍历规则:从第一层级开始,若节点还有子节点,就往下一层进行遍历,保证每层的遍历方式都是前序(中.后),子节点遍历完毕后,再回到上一层继续遍历 以下为例: 我们详细的讲一下中序遍历顺序: 用arr来记录遍历顺序,每一层遍历过程中保证遵守"左中右"的顺序 第一层,顺序是b-a-c,但b有子

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

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

算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value=data; } } 一个数组的MaxTree定义如下: ◆ 数组必须没有重复元素 ◆ MaxTree是一颗二叉树,数组的每一个值对应一

二叉树--已知先序中序求后序--已知中序后序求先序(基本按照网上某大神思路搬过来的)

思路来自(转载自)  http://www.cnblogs.com/fzhe/archive/2013/01/07/2849040.html 题目描述不说了. 前序遍历:  GDAFEMHZ 中序遍历:  ADEFGHMZ 求中序遍历. 1 确定根,确定左子树,确定右子树. 2 在左子树中递归. 3 在右子树中递归. 4 打印当前根. 代码如下: 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 char pr[1000],in[100

先序中序后序遍历

前序遍历,也叫先根遍历,遍历的顺序是,根,左子树,右子树 遍历结果:ABDECF 中序遍历,也叫中根遍历,顺序是 左子树,根,右子树 遍历结果:DBEAFC 后序遍历,也叫后根遍历,遍历顺序,左子树,右子树,根 遍历结果:DEBFCA 先序输出:A B D G H E C K F I J中序输出:G D H B E A K C I J F后序输出:G H D E B K J I F C A