数据结构 实验三(二叉树遍历)

创建一个二叉树,对这棵动态二叉树进行分析,将其用静态二叉链表表示。二叉树的动态二叉链表结构中的每个结点有三个字段:data,lchild,rchild。静态二叉链表是用数组作为存储空间,每个数组元素存储二叉树的一个结点,也有三个字段:data,lchild,rchild。lchild和rdhild分别用于存储左右孩子的下标。
二叉树的遍历源代码

#include<iostream>
using namespace std;

#define OK 1
#define ERROR 0
#define N 100
typedef char TElemType;

typedef struct BiTNode {
	TElemType data;
	struct BiTNode* lchild;//左孩子指针
	struct BiTNode* rchild;//右孩子指针
	int index;
}BiTNode, * BiTree;
typedef struct Tree {
	char Data;
	int Lchild;
	int Rchild;
}TreeNode;
typedef BiTree QueueElementType;
typedef struct Node{
	QueueElementType data;
	struct Node* next;
} LinkQueueNode;  //定义队列结点
typedef struct{
	LinkQueueNode* front; //队列头结点指针
	LinkQueueNode* rear;  //队列尾结点指针
} LinkQueue;  //定义队列

int InitQueue(LinkQueue* Q){
	Q->front = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
	if (Q->front != NULL)
	{
		Q->rear = Q->front;
		Q->front->next = NULL;
		return 1;
	}
	else 
		return 0;//溢出
}

int EnterQueue(LinkQueue* Q, QueueElementType x){
	LinkQueueNode* newnode;
	newnode = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
	if (newnode != NULL){
		newnode->data = x;
		newnode->next = NULL;
		Q->rear->next = newnode;
		Q->rear = newnode;
		return 1;
	}
	else return 0;
}

int DeleteQueue(LinkQueue* Q, QueueElementType* x){
	LinkQueueNode* p;
	if (Q->front == Q->rear)
		return 0;
	p = Q->front->next;
	Q->front->next = p->next;
	if (Q->rear == p)
		Q->rear = Q->front;  //如果去掉结点p后,队列为空 不要忘记将队列置空
	*x = p->data;
	free(p);
	return 1;
}

int IsEmpty(LinkQueue* Q) {
	if (Q->front == Q->rear) return 1;
	else return 0;
}
static int i = 0;
//先序遍历生成二叉树
void CreateBiTree(BiTree* T) {
	TElemType ch;
	scanf_s("%c", &ch, 1);
	if (ch == '#')
		*T = NULL;
	else {
		*T = (BiTree)malloc(sizeof(BiTNode));
		if (!*T)
			cout << "内存分配失败!" << endl;
		(*T)->data = ch;
		(*T)->index = i++;
		CreateBiTree(&(*T)->lchild);//左子树
		CreateBiTree(&(*T)->rchild);//右子树
	}
}

//先序遍历二叉树
void PreOrderTraverse(BiTree T) {
	if (T == NULL)
		return;
	printf("%c ", T->data);
	PreOrderTraverse(T->lchild);
	PreOrderTraverse(T->rchild);
}

//中序遍历二叉树
void InOrderTraverse(BiTree T) {
	if (T == NULL)
		return;
	InOrderTraverse(T->lchild);
	printf("%c ", T->data);
	InOrderTraverse(T->rchild);
}

//后序遍历二叉树
void PostOrderTraverse(BiTree T) {
	if (T == NULL)
		return;
	PostOrderTraverse(T->lchild);
	PostOrderTraverse(T->rchild);
	printf("%c ", T->data);
}

//层次遍历二叉树
void LayerOrder(BiTree T) {
	LinkQueue Q;
	BiTree p;
	InitQueue(&Q);
	if (T == NULL) 
		return ;
	EnterQueue(&Q, T);
	while (!IsEmpty(&Q)){
		if (DeleteQueue(&Q, &p));
		printf("%c ", p->data);
		if (p->lchild) 
			EnterQueue(&Q, p->lchild);
		if (p->rchild) 
			EnterQueue(&Q, p->rchild);
	}
}
static int j = 0;
//动态二叉树转换为静态二叉链表
void Create_QuietTree(BiTree T, TreeNode a[]) {
	a[j].Data = T->data;
	if (T->lchild == NULL)
		a[j].Lchild = 0;
	else
		a[j].Lchild = T->lchild->index;
	if (T->rchild == NULL) {
		a[j].Rchild = 0;
	}
	else {
		a[j].Rchild = T->rchild->index;
	}
	j++;
	if (T->lchild != NULL)
		Create_QuietTree(T->lchild, &a[0]);
	if (T->rchild != NULL)
		Create_QuietTree(T->rchild, &a[0]);
}
//求树的深度
int BiTreeDeep(BiTree T) {
	if (T == NULL)
		return 0;
	else {
		int m = BiTreeDeep(T->lchild);
		int n = BiTreeDeep(T->rchild);
		if (m > n)
			return (m + 1);
		else
			return (n + 1);
	}
}

//求树的结点数
int BiTreeNodeCount(BiTree T) {
	if (T == NULL)
		return 0;
	else
		return BiTreeNodeCount(T->lchild) + BiTreeNodeCount(T->rchild) + 1;
}

//求树的叶子点数
int BiTreeLeafCount(BiTree T) {
	if (!T)
		return 0;
	if (!T->lchild && !T->rchild)
		return 1;
	else
		return BiTreeLeafCount(T->lchild) + BiTreeLeafCount(T->rchild);
}

int main() {
	BiTree T = NULL;
	TreeNode a[N];
	cout << "先序遍历生成二叉树:" << endl;
	CreateBiTree(&T);
	Create_QuietTree(T, &a[0]);
	cout << "先序遍历:" << endl;
	PreOrderTraverse(T);
	cout << endl;
	cout << "中序遍历:" << endl;
	InOrderTraverse(T);
	cout << endl;
	cout << "后序遍历:" << endl;
	PostOrderTraverse(T);
	cout << endl;
	cout << "层次遍历:" << endl;
	LayerOrder(T);
	cout << endl;
	int m = BiTreeDeep(T);
	cout << "树的深度为:" << m << endl;
	int n = BiTreeNodeCount(T);
	cout << "树的结点数为:" << n << endl;
	int k = BiTreeLeafCount(T);
	cout << "树的叶子点数为:" << k << endl;

	printf("说明:当左孩子或右孩子为空时,用0填充\n\n");
	printf("静态二叉链表为:\n");
	printf("i\tData\tLchild\tRchild\t\n");
	int K;
	for (K = 0; K < i; K++){
		printf("%d\t%c\t%d\t%d\n", K, a[K].Data, a[K].Lchild, a[K].Rchild);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值