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

来源:互联网 发布:网络电视必须买盒子么 编辑:程序博客网 时间:2024/06/07 18:16

一颗二叉树的先序遍历: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 <iostream>#include <cstdio>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;i<n;i++)        scanf("%c",&t1[i]);    getchar();    for(i=0;i<n;i++)        scanf("%c",&t2[i]);    work(0,0,n);    return 0;}

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

思路:

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

代码实现:

#include <iostream>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<<t1[a] ;        return;    }    else if(n < 1)        return;    int i = 0;    for(i=0; t1[a] != t2[b+i]; i++);    cout<<t1[a] ;    work(a-1-i,b,i);    work(a-1,b+i+1,n-i-1);}int main(){    int i,n;    cin>>n;    for(i=0; i<n; i++)        cin>>t1[i];    for(i=0; i<n; i++)        cin>>t2[i];    work(n-1,0,n);    return 0;}
0 0
原创粉丝点击