由二叉树的中序和先序或后序求后序或先序

本文对于二叉树的基础知识不作解释,代码由数组实现。

1.已知后序和中序,得到先序序列

input:
5
4 5 2 3 1
4 2 5 1 3
output:
1 2 4 5 3

由二叉树的中序和先序或后序求后序或先序_第1张图片

 

2.已知先序和中序,得到后序序列
input:
8
1 2 3 4 5 6 7 8
2 4 3 5 1 6 8 7
output:
4 5 3 2 8 7 6 1

由二叉树的中序和先序或后序求后序或先序_第2张图片

#include 
#include 
#include 
using namespace std;

const int N = 1<<10;
int z[N],h[N],x[N],n;

void dfsPost(int root,int left ,int right)
{
    printf("%d ",h[root]);
    int idx;    //当前根在中序的位置
    for(idx=1; idx<=n && h[root]!=z[idx]; ++idx);   //在中序序列里找到当前根

    int lq = idx-left;      //左区间大小
    int rq = right-idx;     //右区间大小

    if(lq>0)    dfsPost(root-rq-1, left, idx-1);    //搜左子树
    if(rq>0)    dfsPost(root-1, idx+1, right);      //搜右子树
}//已知中序后序,求先序

void dfsPre(int root,int left,int right)
{
    int idx;
    for(idx=1; idx<=n && x[root]!=z[idx]; ++idx);

    int lq = idx-left;
    int rq = right-idx;

    if(lq>0)    dfsPre(root+1, left, idx-1);
    if(rq>0)    dfsPre(root+lq+1, idx+1, right);

    printf("%d ",x[root]);//当前根
}//已知中序先序,求后序

int main()
{
    puts("输入n");
    scanf("%d",&n);
    puts("输入先序和中序");
    for(int i=1; i<=n; ++i){
        scanf("%d",&x[i]);
    }
    for(int i=1; i<=n; ++i){
        scanf("%d",&z[i]);
    }
    puts("后序序列为");
    dfsPre(1,1,n);
    puts("");

    puts("输入n");
    scanf("%d",&n);
    puts("输入后序和中序");
    for(int i=1; i<=n; ++i){
        scanf("%d",&h[i]);
    }
    for(int i=1; i<=n; ++i){
        scanf("%d",&z[i]);
    }
    puts("先序序列为");
    dfsPost(n,1,n);
    puts("");
    return 0;
}

 

你可能感兴趣的:(Tree)