一.实验目的
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;
}
欢迎订阅专栏,数据结构实验,期末大作业,前端后端都有哦,想我发哪个方面的资源或文章可以私信我,免费的哦