目录
测试样例: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空空空(使用时将“空”换为空格)
运行结果如下: