实验要求
任务1:以算法6.4创建二叉树的存储结构,树的具体形态自定。
任务2:对任务1中的二叉树分别实现先序、中序、后序遍历(递归实现)和中序遍历的非递归实现以及层序遍历;
任务3:统计1中树的结点总数、叶子结点总数以及树的高度;
程序代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAX_TREE_SIZE 100
#define STACK_INIT_SIZE 200
#define STACKINCREMENT 10
#define MAXSIZE 100
#define namx 200
typedef int Status;
typedef int TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
typedef BiTree ElemType;
typedef struct{
ElemType *base;
ElemType *top;
int stacksize;
}Sqstack;
typedef struct Qnode{
ElemType data;
struct Qnode * next;
}QNode,*pQueue;
typedef struct{
pQueue front;
pQueue rear;
}LinkQueue;
Status InitQueue(LinkQueue & Q)
{
Q.rear = (pQueue)malloc(sizeof(QNode));
Q.front = Q.rear;
if(!Q.front) exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
Status IsEmptyQ(LinkQueue &Q)
{
if(Q.front->next == NULL) return TRUE;
else return FALSE;
}
Status Enqueue(LinkQueue & Q, ElemType e)
{
QNode * p =(pQueue) malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
Status Dequeue(LinkQueue & Q, ElemType & e)
{
if(Q.front == Q.rear) return ERROR;
pQueue p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p) Q.rear = Q.front;
free(p);
return OK;
}
Status InitStack(Sqstack & S)
{
S.base = (ElemType *) malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status GetTop(Sqstack S,ElemType & e)
{
if(S.top == S.base) return ERROR;
e = *(S.top -1);
return OK;
}
Status Push(Sqstack & S, ElemType e)
{
if(S.top - S.base >= S.stacksize){
S.base = (ElemType *) realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(ElemType));
if(!S.base) exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top ++ = e;
return OK;
}
Status Pop (Sqstack & S, ElemType & e)
{
if(S.top == S.base) return ERROR;
e = * -- S.top;
return OK;
}
Status IsEmptyS(Sqstack S)
{
if(S.top == S.base) return TRUE;
else return FALSE;
}
Status CreatBiTree(BiTree & T)
{
TElemType ch;
scanf("%d",&ch);
if(ch == -1) T = NULL;
else{
if(!(T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data = ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
return OK;
}
Status PreOrderTraverse(BiTree &T)
{
if(T){
printf("%d ",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
return OK;
}
Status InOrderTraverse(BiTree &T)
{
if(T){
InOrderTraverse(T->lchild);
printf("%d ",T->data);
InOrderTraverse(T->rchild);
}
return OK;
}
Status PostOrderTraverse(BiTree &T)
{
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%d ",T->data);
}
return OK;
}
Status InOrderTraverse_No(BiTree& T)
{
Sqstack S;
InitStack(S); BiTree p = T;
while(p || !IsEmptyS(S)){
if(p){
Push(S,p);
p = p->lchild;
}else{
Pop(S,p);
printf("%d ",p->data);
p = p->rchild;
}
}
return OK;
}
Status LevelOrderTraverse(BiTree T)
{
LinkQueue Q;
InitQueue(Q);
Enqueue(Q,T);
if(!T) return ERROR;
else printf("%d ",T->data);
while(!IsEmptyQ(Q)){
BiTree Temp ; Dequeue(Q,Temp);
if(Temp->lchild){
printf("%d ",Temp->lchild->data);
Enqueue(Q,Temp->lchild);
}
if(Temp->rchild){
printf("%d ",Temp->rchild->data);
Enqueue(Q,Temp->rchild);
}
}
return OK;
}
Status CalNodes(BiTree T)
{
if(!T) return 0;
LinkQueue Q;
InitQueue(Q);
int cnt = 1;
Enqueue(Q,T);
while(!IsEmptyQ(Q)){
BiTree Temp ; Dequeue(Q,Temp);
if(Temp->lchild){
cnt++;
Enqueue(Q,Temp->lchild);
}
if(Temp->rchild){
cnt++;
Enqueue(Q,Temp->rchild);
}
}
return cnt;
}
Status CalLeavesNodes(BiTree T)
{
if(!T) return 0;
LinkQueue Q;
InitQueue(Q);
int cnt = 0;
Enqueue(Q,T);
while(!IsEmptyQ(Q)){
BiTree Temp ; Dequeue(Q,Temp);
if(Temp->lchild) Enqueue(Q,Temp->lchild);
if(Temp->rchild) Enqueue(Q,Temp->rchild);
if(!Temp->lchild && !Temp->rchild) cnt++;
}
return cnt;
}
Status CalHaight(BiTree T)
{
if(!T) return 0;
return max(CalHaight(T->lchild), CalHaight(T->rchild))+1;
}
void Paint()
{
printf("|"); printf(" The Experiment Of Tree ") ;printf("|\n");
printf("|"); printf(" BiTree ") ;printf("|\n");
printf("|"); printf(" Author: Luo Peng Fei ") ;printf("|\n");
printf("|"); printf(" Date:2017/4/26 ") ;printf("|\n");
}
int main()
{
freopen("in.txt","r",stdin);
Paint();
BiTree T = (BiTree)malloc(sizeof(BiTNode));
printf("|"); printf(" 请输入建树信息 ") ;printf("|\n");
CreatBiTree(T);
printf("|"); printf(" 树的先序遍历结果为 ") ;printf("|\n");
PreOrderTraverse(T);
printf("\n");
printf("|"); printf(" 树的中序遍历结果为 ") ;printf("|\n");
InOrderTraverse(T);
printf("\n");
printf("|"); printf(" 树的后序遍历结果为 ") ;printf("|\n");
PostOrderTraverse(T);
printf("\n");
printf("|"); printf(" 树的层序遍历结果为 ") ;printf("|\n");
LevelOrderTraverse(T);
printf("\n");
printf("|"); printf(" 树的中序非递归遍历结果为 ") ;printf("|\n");
InOrderTraverse_No(T);
printf("\n");
printf("|"); printf(" 树的节点总数为 ") ;printf("|\n");
printf("%d\n",CalNodes(T));
printf("|"); printf(" 树的叶子节点总数为 ") ;printf("|\n");
printf("%d\n",CalLeavesNodes(T));
printf("|"); printf(" 树的高度为 ") ;printf("|\n");
printf("%d\n",CalHaight(T));
return 0;
}
运行结果
树的结构
输入数据
1 2 4 -1 -1 5 -1 -1 3 6 -1 -1 7 -1 -1