程序设计实验:树和二叉树的应用

目录

1.实验名称

2.实验目的

3.实验内容

全部代码如下:

测试样例:ABC空空DE空G空空F空空空(使用时将“空”换为空格)

运行结果如下:


1.实验名称

  树和二叉树的应用

2.实验目的

(1)掌握二叉树的结构特性,各种存储结构及其适用范围;

(2)掌握二叉树遍历算法。

3.实验内容

基本要求:

算法:输入字符序列,建立二叉树;按先序、中序、后序遍历二叉树(三种递归算法和中序遍历的非递归算法);

选作内容:

求二叉树的高度和结点的个数。

全部代码如下:

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


//下面为建立二叉树的所有函数
typedef struct BiTree {
	char data;
	struct BiTree *lchild;
	struct BiTree *rchild;
} BiTree, *Bitree;

void CreatBiTree(Bitree &T) {
	char ch;
	ch = getchar();
	if (ch == ' ')
		T = NULL;
	else {
		T = (BiTree *)malloc(sizeof(BiTree));
		if (!T) {
			printf("内存分配失败!");
			exit(-1);
		}
		else {
			T->data = ch;
			CreatBiTree(T->lchild);
			CreatBiTree(T->rchild);
		}
	}
}


//下面为递归先、中、后序遍历二叉树所有函数
void PreOrderTraverse(Bitree T) {
	if (T) {
		printf("%c  ", T->data);
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}

void InOrderTraverse(Bitree T) {
	if (T) {
		InOrderTraverse(T->lchild);
		printf("%c  ", T->data);
		InOrderTraverse(T->rchild);
	}
}

void PostOrderTraverse(Bitree T) {
	if (T) {
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		printf("%c  ", T->data);
	}
}

Bitree T;


//下面为非递归先、中、后序遍历二叉树的所有函数
typedef struct Stack {
	Bitree data;
	struct Stack *top;
} Stack, *stack;

void InitStack(stack &S) {
	S = NULL;
}

void Push(stack &S, Bitree e) {
	stack p;
	p = new Stack;
	p->data = e;
	p->top = S;
	S = p;
}

int Pop(stack &S, Bitree &e) {
	if (S == NULL)
		return -2;
	e = S->data;
	stack p;
	p = new Stack;
	p = S;
	S = S->top;
	delete p;
	return 1;
}

int GetTop(stack S, Bitree &e) {
	if (S == NULL)
		return -2;
	e = S->data;
	return 1;
}

int StackEmpty(stack S) {
	if (S == NULL)
		return 1;
	else
		return 0;
}

void InOrdertracerse(Bitree T) {
	stack S;
	Bitree p, q;
	InitStack(S);
	p = T;
	q = new BiTree;
	while (p || !StackEmpty(S)) {
		if (p) {
			Push(S, p);
			p = p->lchild;
		}
		else {
			Pop(S, q);
			printf("%c  ", q->data);
			p = q->rchild;
		}
	}
}

void PreOrdertracerse(Bitree T) {
	stack S;
	Bitree p, q;
	InitStack(S);
	p = T;
	q = new BiTree;
	while (p || !StackEmpty(S)) {
		if (p) {
			printf("%c  ", p->data);
			Push(S, p);
			p = p->lchild;
		}
		else {
			Pop(S, q);
			p = q->rchild;
		}
	}
}

void PostOrdertracerse(Bitree T) {
	stack S;
	Bitree p, q, z;
	InitStack(S);
	p = T;
	q = new BiTree;
	while (p || !StackEmpty(S)) {
		if (p) {
			Push(S, p);
			p = p->lchild;
		}
		else {
			GetTop(S, q);
			if (q->rchild && q->rchild != z) {
				p = q->rchild;
				Push(S, p);
				p = p->lchild;
			}
			else {
				Pop(S, q);
				printf("%c  ", q->data);
				z = q;
				q = NULL;
			}

		}
	}
}


//下面为层序非递归遍历二叉树所有函数
typedef struct QNode {
	Bitree data;
	struct QNode *next;
} QNode, *QueuePtr;

typedef struct {
	QueuePtr front;
	QueuePtr rear;
} LinkQueue;

void InitQueue(LinkQueue &Q) {
	Q.front = Q.rear = new QNode;
	Q.front->next = NULL;
}

void EnQueue(LinkQueue &Q, Bitree e) {
	QueuePtr p;
	p = new QNode;
	p->data = e;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
}

int DeQueue(LinkQueue &Q, Bitree &e) {
	if (Q.front == Q.rear)
		return -1;
	QueuePtr p;
	p = new QNode;
	p = Q.front->next;
	e = p->data;
	Q.front->next = p->next;
	if (Q.rear == p)
		Q.rear = Q.front;
	delete p;
	return 0;
}

int QueueEmpty(LinkQueue Q) {
	if (Q.front == Q.rear)
		return 1;
	else
		return 0;
}

void Sequencetracerse(Bitree T) {
	LinkQueue Q;
	InitQueue(Q);
	Bitree p, q;
	p = T;
	q = new BiTree;
	EnQueue(Q, p);
	while (!QueueEmpty(Q)) {
		if (!QueueEmpty(Q)) {
			DeQueue(Q, q);
			printf("%c  ", q->data);
			if (q->lchild)
				EnQueue(Q, q->lchild);
			if (q->rchild)
				EnQueue(Q, q->rchild);

		}
	}

}


//下面为(递归)计算二叉树信息的所有函数
int Hight(Bitree T) {
	if (T == NULL)
		return 0;
	else {
		int m = Hight(T->lchild);
		int n = Hight(T->rchild);
		return (m > n) ? (m + 1) : (n + 1);
	}
}

int m = 0;

int NumberLeaf(Bitree T) {
	if (T == NULL)
		return 0;
	else {
		if (T->lchild == NULL && T->rchild == NULL) {
			m++;
		}
		NumberLeaf(T->lchild);
		NumberLeaf(T->rchild);
		return m;
	}
}

int n;

int NumberNode(Bitree T) {
	if (T == NULL)
		return 0;
	else {
		n++;
		NumberNode(T->lchild);
		NumberNode(T->rchild);
		return n;
	}
}

void Information() {
	printf("\n\n\n————————————————————————二叉树的信息————————————————————————\n");
	printf("该二叉树的高度:%d\n", Hight(T));
	printf("叶子结点的个数:%d\n", NumberLeaf(T));
	printf("二叉树总结点树:%d\n", NumberNode(T));
}


//下面为功能处理所有函数
void tips_Traceres() {
	printf("————————————————————————二叉树的遍历————————————————————————\n");
	printf("0、退出使用\n"
	       "1、前序遍历二叉树(递归)\n"
	       "2、中序遍历二叉树(递归)\n"
	       "3、后序遍历二叉树(递归)\n"
	       "4、前序遍历二叉树(非递归)\n"
	       "5、中序遍历二叉树(非递归)\n"
	       "6、后序遍历二叉树(非递归)\n"
	       "7、层序遍历二叉树(非递归)\n"
	       "-1、进入“二叉树的信息选项”\n");
}

void Select() {
	int i;
	tips_Traceres();
start:
	printf("输入要实现的功能:");
	scanf("%d", &i);
	switch (i) {
		case 1: {
			printf("前序遍历二叉树:");
			PreOrderTraverse(T);
			printf("\n\n");
			break;
		}
		case 2: {
			printf("中序遍历二叉树:");
			InOrderTraverse(T);
			printf("\n\n");
			break;
		}
		case 3: {
			printf("后序遍历二叉树:");
			PostOrderTraverse(T);
			printf("\n\n");
			break;
		}
		case 4: {
			printf("先序遍历二叉树(非递归):");
			PreOrdertracerse(T);
			printf("\n\n");
			break;
		}
		case 5: {
			printf("中序遍历二叉树(非递归):");
			InOrdertracerse(T);
			printf("\n\n");
			break;
		}
		case 6: {
			printf("后序遍历二叉树(非递归):");
			PostOrdertracerse(T);
			printf("\n\n");
			break;
		}
		case 7: {
			printf("层序遍历二叉树(非递归):");
			Sequencetracerse(T);
			printf("\n\n");
			break;
		}
		case 0: {
			printf("Thank you!\n");
			goto end;
			break;
		}
		case -1: {
			Information();
			break;
		}
	}
	goto start;
end:
	;
}


//主函数
int main() {
	printf("前序输入二叉树:");
	CreatBiTree(T);
	Select();
	return 0;
}


 

测试样例:ABC空空DE空G空空F空空空(使用时将“空”换为空格)

运行结果如下:

 

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值