实验五 二叉树的建立及遍历应用
一、【实验目的】
1、掌握二叉树的建立方法
2、掌握二叉树遍历的基本方法(先序、中序、后序)
3、掌握递归二叉树遍历算法的应用
二、【实验内容】
1.构造一棵二叉树,树的形态如下图所示,打印出先序遍历、中序遍历、后序遍历的遍历序列。
2.选择一种遍历方式计算该树中叶子结点的个数,并打印出叶子结点。
提示:
先根据给定的树,写出此树的扩展先序遍历序列,然后根据此遍历序列建立二叉树。
三、【实验源代码】
层序遍历
#include <stdio.h>
#include <stdlib.h>
#define QueueMax 100
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(); //建立二叉树
Queue InitQueue(); //初始化队列
int IsEmptyQueue(Queue seq); //队列判空
int IsFullQueue(Queue seq); //队列判满
void PushQueue(Queue *seq, BiTree T); //入队
void PopQueue(Queue *seq, BiTree *T); //出队
void LayerOrder(BiTree T); //层序遍历
int main()
{
BiTree T;
T = CreateTree();
LayerOrder(T);
return 0;
}
BiTree CreateTree()
{ //建立二叉树
char c;
c = getchar();
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<malloc.h>
typedef struct LBinaryTreeNode{
char data;
struct LBinaryTreeNode *lchild;
struct LBinaryTreeNode *rchild;
}LPBTreeNode;
LPBTreeNode *creat()
{
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 = creat();
pbnode->rchild = creat();
}
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);
}
int yezi(LPBTreeNode *t)//求叶子节点
{
static int sum=0;
if(t==NULL) return;
else
{
if(t->lchild==NULL&&t->rchild==NULL)
{
printf("%c ",t->data);
sum++;
}
yezi(t->lchild);
yezi(t->rchild);
}
return sum;
}
//ABCD##E###FG#####
int main(void)
{
int sum=0;
LPBTreeNode* t;
t=creat();
preorder(t);//先序序列
printf("\n");
inorder(t);//中序序列
printf("\n");
postorder(t);//后序序列
printf("\n");
printf("%d",yezi(t));
return 0;
}