数据结构——树的遍历相关笔试题

一颗二叉树的先序遍历:ABDECFG;中序遍历:DBEAFCG;后序遍历:DEBFGCA。

对于二叉树的遍历在之前的博客中有介绍:
http://blog.csdn.net/Su_coding/article/details/70184419

1.根据先序和中序遍历写出后序遍历:

思路:

  1. 根据先序遍历可知根节点为A;
  2. 根据中序遍历可知DBE为A的左子树,FCG为A的右子树;
  3. 递归实现,把DBE当作一颗新树,把FCG当作一颗新树;
  4. 在递归的过程当中输出后序。

代码实现:

#include 
#include 

using namespace std;
/*
 *  t1存储先序遍历输入进去的数组,t2存储中序遍历输入进去的数组。
 */
char t1[100],t2[100];

/*
 *a代表先序遍历数组中的下标;
 *b代表中序遍历数组中的下标;
 *n代表传进来数组中的个数。
 */
void work(int a,int b,int n)
{
    if(n == 1)
    {
        printf("%c ",t1[a]);
        return ;
    }
    else if(n < 1)
        return;
    int i = 0;

    for(i=0;t1[a] != t2[b+i];i++);

    work(a+1,b,i);
    work(a+i+1,b+i+1,n-i-1);

    printf("%c ",t1[a]);
}

int main()
{
    int i,n;
    scanf("%d",&n);
    getchar();
    for(i=0;iscanf("%c",&t1[i]);
    getchar();
    for(i=0;iscanf("%c",&t2[i]);

    work(0,0,n);
    return 0;
}

2.根据后序和中序求前序

思路:

  1. 根据后序遍历可知根节点为A;
  2. 根据中序遍历可知DBE为A的左子树,FCG为A的右子树;
  3. 递归实现,把DBE当作一颗新树,把FCG当作一颗新树;
  4. 在递归的过程当中输出前序。

代码实现:

#include 

using namespace std;
/*
 *t1存储后序遍历输入的数组,t2存储中序遍历输入的数组。
 */
char t1[100],t2[100];
/*
 *  a代表后序遍历数组中的下标
 *  b代表中序遍历数组中的下标
 *  c代表传参时数组中有效的数据个数
 */
void work(int a,int b,int n)
{
    if(n == 1)
    {
        cout<return;
    }
    else if(n < 1)
        return;

    int i = 0;
    for(i=0; t1[a] != t2[b+i]; i++);

    cout<1-i,b,i);
    work(a-1,b+i+1,n-i-1);
}

int main()
{
    int i,n;
    cin>>n;
    for(i=0; icin>>t1[i];
    for(i=0; icin>>t2[i];

    work(n-1,0,n);
    return 0;
}

你可能感兴趣的:(数据结构)