数据结构与算法题目集(中文)6-9 二叉树的遍历 (25分)

1.题目

本题要求给定二叉树的4种遍历。

函数接口定义:

void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );

其中BinTree结构定义如下:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

要求4个函数分别按照访问顺序打印出结点的内容,格式为一个空格跟着一个字符。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); /* 实现细节忽略 */
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );

int main()
{
    BinTree BT = CreatBinTree();
    printf("Inorder:");    InorderTraversal(BT);    printf("\n");
    printf("Preorder:");   PreorderTraversal(BT);   printf("\n");
    printf("Postorder:");  PostorderTraversal(BT);  printf("\n");
    printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
    return 0;
}
/* 你的代码将被嵌在这里 */

输出样例(对于图中给出的树):

Inorder: D B E F A G H C I
Preorder: A B D F E C G H I
Postorder: D E F B H G I C A
Levelorder: A B C D F G I E H

2.题目分析

1.void InorderTraversal( BinTree BT );中序遍历,即“左,根,右” 先输出根节点,再递归进入左节点,之后再递归进入右节点

2.void PreorderTraversal( BinTree BT ); 先序遍历,即“根,左,右”先递归进入左节点,之后返回一层输出根节点,再递归进入右节点

3.void PostorderTraversal( BinTree BT );后序遍历,即“左,右,跟”先不断递归进入左节点,再分别递归入右节点,之后输出根节点

4.void LevelorderTraversal( BinTree BT );层序遍历,即一层一层从上往下从左往右输出节点

层序遍历具体的实现方法:

声明一个binTree[100]数组,使用head、last两个指针;

首先将根节点输出,并将last指针++,接着将根节点的左、右节点放到数组中进行缓存,同时使last指针++;

下一次再将左节点输出,同时将左节点的左、右节点存入数组,last++,右节点同理;

最后当head与last值相等的时候,表示到达最右下方节点,输出结束。

3.代码

void InorderTraversal( BinTree BT )
{
   if(BT==NULL)
   return;//注意要处理子树为空的情况,如果不加处理,访问不存在的节点的左、右子树会报错
   InorderTraversal(BT->Left);
   printf(" %c",BT->Data);
   InorderTraversal(BT->Right);

}
void PreorderTraversal( BinTree BT )
{
      if(BT==NULL)
   return;
     printf(" %c",BT->Data);
   PreorderTraversal(BT->Left);
   PreorderTraversal(BT->Right);

}


void PostorderTraversal( BinTree BT )
{

     if(BT==NULL)
   return;
    
   PostorderTraversal(BT->Left);
   PostorderTraversal(BT->Right);
    printf(" %c",BT->Data);
}

//层序遍历
void LevelorderTraversal(BinTree BT)
{
    if (BT == NULL)
        return;
    BinTree binTree[100];   //数组迭代存储层序遍历的节点
    int head = 0, last = 0; //
    binTree[last++] = BT;
 
    while (head < last)     //通过迭代存储和遍历节点
    {
        BinTree temp = binTree[head++];
        printf(" %c", temp->Data);
 
        if (temp->Left)     //左子树存在
            binTree[last++] = temp->Left;
        if (temp->Right)    //右子树存在
            binTree[last++] = temp->Right;
    }
}

 

posted @ 2020-02-02 21:19  Jason66661010  阅读(1072)  评论(0编辑  收藏  举报