目前只实现了这些
后面要去了解哈夫曼树,作业是编码文档并解码,需要这棵树
#include <stdio.h>
#include <stdlib.h>
#define ElementType int
#define LEN 3
/**二叉树*/
typedef struct TreeNode{
ElementType val;
struct TreeNode *left;
struct TreeNode *right;
}BiNode,*BiTree;
/**栈的定义*/
#define STACK_INIT_SIZE 100 //初始分配空间
#define STACKINCREMENT 10 //分配增量
#define OK 1
#define ERROR 0
#define SElemType BiTree
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
/*构造空栈*/
int InitStack(SqStack * SPtr);
/*销毁栈*/
int DestoryStack(SqStack * SPtr);
/*把栈置空*/
int ClearStack(SqStack * SPtr);
/*判空*/
int StackEmpty(SqStack S);
/*返回栈顶元素*/
int GetTop(SqStack S,SElemType * e);
/*入栈*/
int Push(SqStack * SPtr,SElemType e);
/*出栈*/
int Pop(SqStack * SPtr,SElemType * e);
/**队列定义*/
#define QElemType BiTree
#define MAXSIZE 40
typedef struct{
QElemType *base;
int front;
int rear;
}Queue;
/*初始化队列*/
void InitQuene(Queue * QPtr);
/*入队*/
void EnQuene(Queue* QPtr,QElemType E);
/*出队*/
void DeQuene(Queue* QPtr,QElemType* E);
/*销毁队列*/
void DestoryQueue(Queue* QPtr);
/*创建二叉树*/
int CreateTree(BiTree* TPtr);
/*打印二叉树*/
void PrintTree(BiTree T,int i);
/*递归,前序遍历*/
void PreOrder(BiTree T);
/*非递归,先序遍历*/
void PreOrderPlus(BiTree T);
/*递归,中序遍历*/
void InOrder(BiTree T);
/*非递归,中序遍历*/
void InOrderPlus(BiTree T);
/*递归,后序遍历*/
void LaOrder(BiTree T);
/*非递归,后序遍历*/
void LaOrderPlus(BiTree T);
/*层序遍历*/
void LevelOrder(BiTree T);
/*求二叉树的深度*/
int Height(BiTree T);
/*求二叉树的节点数*/
int Count(BiTree T);
int main()
{
BiTree T;//1 2 3 0 0 4 0 0 5 6 0 0 7 0 0
CreateTree(&T);
printf("创建完毕\n");
PrintTree(T,LEN);
printf("打印完毕\n");
PreOrder(T);
printf("前序递归完毕\n");
PreOrderPlus(T);
printf("前序非递归完毕\n");
InOrder(T);
printf("中序递归完毕\n");
InOrderPlus(T);
printf("中序非递归完毕\n");
LaOrder(T);
printf("后序递归完毕\n");
LaOrderPlus(T);
printf("后序非递归完毕\n");
LevelOrder(T);
printf("层序遍历完毕\n");
int height;
height = Height(T);
printf("height = %d\n",height);
int count;
count = Count(T);
printf("count = %d\n",count);
return 0;
}
/*创建二叉树*/
int CreateTree(BiTree* TPtr)
{
(*TPtr) = NULL; //初始化
ElementType val;
scanf("%d",&val);
if(val == 0)
{
return 0;
}
else
{
(*TPtr) = (BiTree*)malloc(sizeof(BiNode));
if(!TPtr) exit(0); //申请内存失败
(*TPtr)->val = val;
CreateTree(&((*TPtr)->left));
CreateTree(&((*TPtr)->right));
}
return 1;
}
/*打印二叉树*/
void PrintTree(BiTree T,int i)
{
if(T != NULL)
{
PrintTree(T->right,i+LEN);
if(T->val != 0)
{
printf("%*d\n",i,T->val);
}
PrintTree(T->left,i+LEN);
i -= LEN;
}
}
/*递归,前序遍历*/
void PreOrder(BiTree T)
{
if(T)
{
printf("%d\n",T->val);
PreOrder(T->left);
PreOrder(T->right);
}
}
/*非递归,先序遍历*/
void PreOrderPlus(BiTree T)
{
BiTree tem = T;
/*创立及初始化栈*/
SqStack S;
SqStack * SPtr = &S;
InitStack(SPtr);
while(tem != NULL || !StackEmpty(S))//当栈空树也空,就应该结束循环了
{
while(tem != NULL)
{
printf("%d ",tem->val);
Push(SPtr,tem);
tem = tem->left;
}
if(!StackEmpty(S))
{
Pop(SPtr,&tem);
tem = tem->right;
}
}
DestoryStack(SPtr);
printf("\n");
}
/*递归,中序遍历*/
void InOrder(BiTree T)
{
if(T)
{
InOrder(T->left);
printf("%d\n",T->val);
InOrder(T->right);
}
}
/*非递归,中序遍历*/
void InOrderPlus(BiTree T)
{
BiTree tem = T;
/*创立及初始化栈*/
SqStack S;
SqStack * SPtr = &S;
InitStack(SPtr);
/*栈空或树空退出*/
while(tem != NULL || !StackEmpty(S))
{
/*将当前树及其左子全部入栈*/
while(tem != NULL)
{
Push(SPtr,tem);
tem = tem->left;
}
/*出栈一个,打印,寻找当前出栈点的右子*/
if(!StackEmpty(S))
{
Pop(SPtr,&tem);
printf("%d ",tem->val);
tem = tem->right;
}
}
DestoryStack(SPtr); //销毁栈
printf("\n");
}
/*递归,后序遍历*/
void LaOrder(BiTree T)
{
if(T)
{
LaOrder(T->left);
LaOrder(T->right);
printf("%d\n",T->val);
}
}
/*非递归,后序遍历*/
void LaOrderPlus(BiTree T)
{
if(!T) exit(0); //空,退出
BiTree tem = T,cur = T;
int flag;
/*创立及初始化栈*/
SqStack S;
SqStack * SPtr = &S;
InitStack(SPtr);
Push(SPtr,tem); //根结点入栈
/*栈空或树空退出*/
while(!StackEmpty(S))
{
GetTop(S,&tem);
/*flag是条件,当前节点是叶子或者其孩子已经遍历*/
flag = ((tem->left == NULL && tem->right == NULL) || cur == tem->left || cur == tem->right);
if(flag)
{
Pop(SPtr,&tem);
printf("%d ",tem->val);
cur = tem;
}
else
{
if(tem->right)
{
Push(SPtr,tem->right);
}
if(tem->left)
{
Push(SPtr,tem->left);
}
}
}
DestoryStack(SPtr); //销毁栈
printf("\n");
}
/*层序遍历*/
void LevelOrder(BiTree T)
{
if(!T) exit(-1);//空,退出
BiTree tem = T;
/*创建队列*/
Queue Q;
Queue* QPtr = &Q;
InitQuene(QPtr);
EnQuene(QPtr,tem);
while(Q.front != Q.rear)//队列不空
{
DeQuene(QPtr,&tem);
printf("%d ",tem->val);
if(tem->left)
{
EnQuene(QPtr,tem->left);
}
if(tem->right)
{
EnQuene(QPtr,tem->right);
}
}
}
/*求二叉树的深度*/
int Height(BiTree T)
{
int h_left,h_right;
if(!T) return 0; //空,返回0,出口
h_left = Height(T->left);
h_right = Height(T->right);
if(h_left>h_right)
{
return h_left+1;
}
else
{
return h_right+1;
}
}
/*求二叉树的节点数*/
int Count(BiTree T)
{
int r_count,l_count;
if(!T) return 0; //出口
printf("哭哭哭\n");
r_count = Count(T->right);
l_count = Count(T->left);
return r_count+l_count+1;
}
/*构造空栈*/
int InitStack(SqStack * SPtr)
{
SPtr->base = (SElemType * )malloc(sizeof(SElemType)*STACK_INIT_SIZE);
if(!SPtr->base) return ERROR; //申请内存失败,强制退出
SPtr->top = SPtr->base;
SPtr->stacksize = STACK_INIT_SIZE;//printf("函数内部SPtr->top = %p\n",SPtr->top);
return OK;
}
/*销毁栈*/
int DestoryStack(SqStack * SPtr)
{
if(!SPtr->base) return ERROR; //栈本来就为空
free(SPtr->base); //释放空间
//printf("函数外S.top = %p,S.base = %p\n",SPtr->top,SPtr->base);
SPtr->base = NULL;
SPtr->top = NULL;
SPtr->stacksize = 0;
return OK;
}
/*把栈置空*/
int ClearStack(SqStack * SPtr)
{
if(!SPtr->base) return ERROR; //栈空
SPtr->top = SPtr->base;
return OK;
}
/*判空*/
int StackEmpty(SqStack S)
{
if(S.base == S.top)
return OK;
else
return ERROR;
}
/*返回栈顶元素*/
int GetTop(SqStack S,SElemType * e)
{
if(S.base == S.top) return ERROR; //空
*e = *(S.top-1);
return OK;
}
/*入栈*/
int Push(SqStack * SPtr,SElemType e)
{
if(SPtr->top-SPtr->base >= SPtr->stacksize) //满
{
SPtr->base = (SElemType * )realloc(SPtr->base,(SPtr->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!SPtr->base) return ERROR; //申请失败,退出
SPtr->top = SPtr->base+SPtr->stacksize; //relloc函数可能改变数据位置
SPtr->stacksize += STACKINCREMENT; //更新数据总数
}
*(SPtr->top++) = e;
return OK;
}
/*出栈*/
int Pop(SqStack * SPtr,SElemType * e)
{
if(SPtr->base == SPtr->top) return ERROR; //空
*e = *(--SPtr->top);
return OK;
}
/*初始化队列*/
void InitQuene(Queue * QPtr)
{
QPtr->base = NULL;
QPtr->base = (QElemType*)malloc(sizeof(QElemType)*MAXSIZE);//申请内存
if(!(QPtr->base)) exit(0); //申请内存失败
QPtr->front = 0;
QPtr->rear = 0;
}
/*入队*/
void EnQuene(Queue* QPtr,QElemType E)
{
if((QPtr->rear+1)%MAXSIZE == QPtr->front) //队满
{
printf("队满\n");
exit(-1);
}
else
{
QPtr->base[QPtr->rear] = E;
QPtr->rear = (QPtr->rear+1)%MAXSIZE;
}
}
/*出队*/
void DeQuene(Queue* QPtr,QElemType* E)
{
if(QPtr->front == QPtr->rear)
{
printf("队空\n");
exit(-1);
}
else
{
(*E) = QPtr->base[QPtr->front];
QPtr->front = (QPtr->front+1)%MAXSIZE;
}
}
/*销毁队列*/
void DestoryQueue(Queue* QPtr)
{
free(QPtr->base);
QPtr->base = NULL;
QPtr->front = 0;
QPtr->rear = 0;
}