数据结构实验----二叉树

一.实验目的

1.理解二叉树的链式存储结构;

2.掌握二叉树遍历的递归及非递归算法。

二.实验内容

1.采用二叉链表作为存储结构,创建一棵二叉树;

2.用递归及非递归算法对二叉树实现先序遍历;

3.用递归及非递归算法对二叉树实现中序遍历;

4.用递归及非递归算法对二叉树实现后序遍历。

5.计算不同度的结点个数

三.代码

//只能选择c++,但代码还是c的,除了头文件,差别不大
#include <stdio.h> 
#include <stdlib.h>

#define MAX_TREE_SIZE 100

typedef char TElemType;

typedef struct BiTNode {
	TElemType data;
	BiTNode* lchild, * rchild;
} BiTNode, * BiTree;

void CreateBiTree(BiTree& T) { //创建二叉树的递归实现
	char ch;
	scanf("%c", &ch);
	if (ch == '#') {
		T = NULL;
	} else {
		T = (BiTNode*)malloc(sizeof(BiTNode));
		T->data = ch;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
}

void PreOrder(BiTree BT) { //先序遍历
	if (BT != NULL) {
		printf("%c ", BT->data);
		PreOrder(BT->lchild);
		PreOrder(BT->rchild);
	}
}

void InOrder(BiTree BT) { //中序遍历
	if (BT != NULL) {
		InOrder(BT->lchild);
		printf("%c ", BT -> data);
		InOrder(BT->rchild);
	}
}

void PostOrder(BiTree BT) { //后序遍历
	if (BT != NULL) {
		PostOrder(BT->lchild);
		PostOrder(BT->rchild);
		printf("%c ", BT->data);
	}
}

void NRPreOrder(BiTree BT) { //先序遍历的非递归实现
	BiTree stack[MAX_TREE_SIZE], p;
	int top;
	if (BT != NULL) {
		top = 1;
		stack[top] = BT;
		while (top > 0) {
			p = stack[top];
			top--;
			printf("%c ", p->data);
			if (p->rchild != NULL) {
				top++;
				stack[top] = p->rchild;
			}
			if (p->lchild != NULL) {
				top++;
				stack[top] = p->lchild;
			}
		}
	}
}

void NRInOrder(BiTree BT) { //中序遍历的非递归实现
	BiTree stack[MAX_TREE_SIZE], p;
	int top = 0;
	p = BT;
	do {
		while (p != NULL) {
			top++;
			stack[top] = p;
			p = p->lchild;
		}
		if (top > 0) {
			p = stack[top];
			top--;
			printf("%c ", p->data);
			p = p->rchild;
		}
	} while (p != NULL || top > 0);
}

void NRPostOrder(BiTree BT) { //后序遍历的非递归实现
	BiTree stack[MAX_TREE_SIZE], p, q;
	int top = 0;
	int flag;
	p = BT;
	do {
		while (p != NULL) {
			top++;
			stack[top] = p;
			p = p->lchild;
		}
		q = NULL;
		flag = 1;
		while (top > 0 && flag) {
			p = stack[top];
			if (p->rchild == q || p->rchild == NULL) {
				printf("%c ", p->data);
				top--;
				q = p;
			} else {
				p = p->rchild;
				flag = 0;
			}
		}
	} while (top > 0);
}

int CountLeaves(BiTree T, int& count) { //统计叶子节点数量
	if (T == NULL) {
		return count;
	} else {
		if (T->lchild == NULL && T->rchild == NULL) {
			count++;
		}
		CountLeaves(T->lchild, count);
		CountLeaves(T->rchild, count);
	}
}

int CountNode1(BiTree T, int& count) { //统计度为1的节点数量
	if (T == NULL) {
		return count;
	} else {
		if ((T->lchild == NULL && T->rchild != NULL) || (T -> lchild != NULL && T -> rchild == NULL)) {
			count++;
		}
		CountNode1(T -> lchild, count);
		CountNode1(T -> rchild, count);
	}
}

int CountNode2(BiTree T, int& count) { //统计度为2的节点数量
	if (T == NULL) {
		return count;
	} else {
		if (T -> lchild != NULL && T -> rchild != NULL) {
			count++;
		}
		CountNode2(T -> lchild, count);
		CountNode2(T -> rchild, count);
	}
}

int CountAllNodes(BiTree T, int& count) { //统计所有节点数量
	if (T == NULL) {
		return count;
	} else {
		count++;
		CountAllNodes(T -> lchild, count);
		CountAllNodes(T -> rchild, count);
	}
}

int BiTreeDepth(BiTree T) { //计算二叉树的高度
	int lchildDep, rchildDep;
	if (T == NULL) {
		return 0;
	} else {
		lchildDep = BiTreeDepth(T -> lchild);
		rchildDep = BiTreeDepth(T -> rchild);
		return (lchildDep > rchildDep) ? (lchildDep + 1) : (rchildDep + 1);
	}
}

int main() {
	BiTree T;
	int count[4] = { 0 };
	printf("请按先序遍历的顺序输入二叉树,空节点用#表示:");
	CreateBiTree(T);

	printf("先序遍历:");
	PreOrder(T);
	printf("\n");

	printf("中序遍历:");
	InOrder(T);
	printf("\n");

	printf("后序遍历:");
	PostOrder(T);
	printf("\n");

	printf("先序遍历的非递归实现:");
	NRPreOrder(T);
	printf("\n");

	printf("中序遍历的非递归实现:");
	NRInOrder(T);
	printf("\n");

	printf("后序遍历的非递归实现:");
	NRPostOrder(T);
	printf("\n");

	printf("二叉树中叶子节点数量:%d\n", CountLeaves(T, count[0]));

	printf("二叉树中度为1的节点数量:%d\n", CountNode1(T, count[1]));

	printf("二叉树中度为2的节点数量:%d\n", CountNode2(T, count[2]));

	printf("二叉树中所有节点数量:%d\n", CountAllNodes(T, count[3]));

	printf("二叉树的高度:%d\n", BiTreeDepth(T));

	return 0;
}	

欢迎订阅专栏,数据结构实验,期末大作业,前端后端都有哦,想我发哪个方面的资源或文章可以私信我,免费的哦

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

然然超绝肌肉线条

你的鼓励将是创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值