实验五 二叉树的建立及遍历应用
一、【实验目的】
1、掌握二叉树的建立方法
2、掌握二叉树遍历的基本方法(先序、中序、后序)
3、掌握递归二叉树遍历算法的应用
二、【实验内容】
1.构造一棵二叉树,打印出先序遍历、中序遍历、后序遍历的遍历序列。
2.选择一种遍历方式计算该树中叶子结点的个数,并打印出叶子结点。
提示:
先根据给定的树,写出此树的扩展先序遍历序列,然后根据此遍历序列建立二叉树。
3.选作题:编写一个层序遍历算法,利用队列结构按层次(同一层自左至右)输出二叉树中所有的结点。
三、【实验源代码】
头文件
typedef struct LBinaryTreeNode
{
ElemType data;
struct LBinaryTreeNode *lchild;
struct LBinaryTreeNode *rchild;
}LPBTreeNode;
void Initiate(LPBTreeNode *p) /*初始化创建二叉树的头结点*/
{
p=(LPBTreeNode *)malloc(sizeof(LPBTreeNode));
p->lchild =NULL;
p->rchild=NULL;
}
LPBTreeNode *createbintree()
{
LPBTreeNode *pbnode;
char ch;
scanf("%c",&ch);
if(ch=='#')pbnode=NULL;
else
{
pbnode=(LPBTreeNode *)malloc(sizeof(LPBTreeNode));
if(pbnode==NULL)
{
printf("out of space!\n");
return pbnode;
}
pbnode->data =ch;
pbnode->lchild =createbintree();
pbnode->rchild =createbintree();
}
return pbnode;
}
void preorder(LPBTreeNode *t)
{
if(t==NULL)return;
printf("%c",t->data);
preorder(t->lchild );
preorder(t->rchild );
}
void inorder(LPBTreeNode *t)
{
if(t==NULL)return ;
inorder(t->lchild );
printf("%c",t->data);
inorder(t->rchild );
}
void postorder(LPBTreeNode *t)
{
if(t==NULL)return ;
postorder(t->lchild );
postorder(t->rchild );
printf("%c",t->data);
}
void leaf(LPBTreeNode *p)
{
if(p!=NULL)
{
if((p->lchild==NULL)&&(p->rchild ==NULL))
printf("%c",p->data);
leaf(p->lchild );
leaf(p->rchild );
}
}
主函数
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
#include"LBinaryTreeNode.h"
int main()
{
LPBTreeNode *p;
Initiate(p);
if(p!=NULL)
{
p=createbintree();
}
printf("先序遍历:\n");
preorder(p);
printf("\n中序遍历:\n");
inorder(p);
printf("\n后序遍历:\n");
postorder(p);
printf("\n打印叶子节点:\n");
leaf(p);
return 0;
}
选做题
头文件
typedef struct Node
{
char data;
struct Node *LChild, *RChild;
}BiNode, *BiTree;
typedef struct
{
BiTree data[QueueMax];
int head;
int rear;
int len;
}Queue;
BiTree CreateTree()
{ //建立二叉树
char c;
scanf("%c",&c);
BiTree T;
if (c == '#') {
return NULL;
}
T = (BiTree) malloc (sizeof(BiNode));
T->data = c;
T->LChild = CreateTree();
T->RChild = CreateTree();
return T;
}
Queue InitQueue()
{ //初始化队列
Queue seq;
int i;
for( i = 0; i < QueueMax; i++)
{
seq.data[i] = NULL;
}
seq.head = 0;
seq.rear = -1;
seq.len = 0;
return seq;
}
int IsEmptyQueue(Queue seq)
{ //队列判空
if (seq.len == 0) {
return 1;
}
return 0;
}
int IsFullQueue(Queue seq)
{ //队列判满
if (seq.len == QueueMax) {
return 1;
}
return 0;
}
void PushQueue(Queue *seq, BiTree T)
{ //入队
if (IsFullQueue(*seq)) {
printf("ErrorFull");
return;
}
seq->rear = (seq->rear + 1) % QueueMax;
seq->len++;
seq->data[seq->rear] = T;
}
void PopQueue(Queue *seq, BiTree *T)
{ //出队
if (IsEmptyQueue(*seq)) {
printf("ErrorEmpty");
return;
}
seq->head = (seq->head + 1) % QueueMax;
*T = seq->data[seq->head];
seq->len--;
}
void LayerOrder(BiTree T)
{ //层序遍历
Queue seq;
seq = InitQueue();
BiTree tmp;
tmp = T;
PushQueue(&seq, tmp);
while(!IsEmptyQueue(seq)) {
printf("%c", tmp->data);
if (tmp->LChild != NULL) {
PushQueue(&seq, tmp->LChild);
}
if (tmp->RChild != NULL) {
PushQueue(&seq, tmp->RChild);
}
PopQueue(&seq, &tmp);
}
}
主函数
#include <stdio.h>
#include <stdlib.h>
#define QueueMax 100
#include"Tree.h"
int main()
{
BiTree T;
T = CreateTree();
printf("层序遍历:\n");
LayerOrder(T);
return 0;
}