数据结构实验五 二叉树的建立及遍历应用

实验五 二叉树的建立及遍历应用

一、【实验目的】
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;
 }

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值