二叉树后序遍历 (先序和中序求后序)

Posted ww123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树后序遍历 (先序和中序求后序)相关的知识,希望对你有一定的参考价值。

 

描述

在数据结构中,遍历是二叉树最重要的操作之一。所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。

这里给出三种遍历算法。

1.中序遍历的递归算法定义:
     若二叉树非空,则依次执行如下操作:
         (1)遍历左子树;
         (2)访问根结点;
         (3)遍历右子树。

2.前序遍历的递归算法定义:
    若二叉树非空,则依次执行如下操作:
         (1) 访问根结点;
         (2) 遍历左子树;
         (3) 遍历右子树。

3.后序遍历得递归算法定义:
    若二叉树非空,则依次执行如下操作:
         (1)遍历左子树;
         (2)遍历右子树;
         (3)访问根结点。
现在给出一个二叉树的中序遍历和前序遍历。求它的后序遍历。

样例中的二叉树如下:

     a                      x
/ \ / \
b c n u
/ \ / / \
d e f l i
/
g
2

输入

输入有多组数据,第一行有一个整数n,表示有n组数据。每组数据两行,每行均是由a-z的字符组成的字符串,每个字母表示一个结点。其顺序,分别为树的中序遍历和前序遍历。长度小于27.

输出

对于每组数据,输出一行,树的后序遍历。

样例输入

2
dbgeafc
abdegcf
lnixu
xnliu

样例输出

dgebfca
linux

#include <iostream>
#include <algorithm>
using namespace std;
#include <cstdio>
#include <string>
#include <cstring>
int a[1005];
int t;
string s,ss;
int create(int preleft,int preright,int inleft,int inright)
{
    int i,j,k;
    for(i=inleft;i<=inright;i++){
        if(ss[i]==s[preleft])
            break;
    }   //用中序遍历找出根左右边的元素
   int left=i-inleft;
   int right=inright-i;
   if(left>0){
    create(preleft+1,preleft+left-1,inleft,left+inleft-1);
   }//左边有元素
   if(right>0){
    create(preleft+left+1,preright,inleft+left+1,inright);
   }//右边有元素
   cout<<s[preleft]; //输出根

}
int main()
{
    int n,m,i,j,k;
    scanf("%d",&n);
    while(n--){
        cin>>ss>>s;
        create(0,s.length()-1,0,ss.length()-1);
        cout<<"\n";
    }

}

 

 

 

 

以上是关于二叉树后序遍历 (先序和中序求后序)的主要内容,如果未能解决你的问题,请参考以下文章

已知先序中序求后序的算法:

UVa 二叉树重建(先序+中序求后序)

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

已知二叉树的先序序列和中序序列怎么求后序序列?不是基于C++的,要在TC环境下能运行的,各位能人帮帮忙吧

如何根据中序遍历和后序遍历求前序遍历

通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码