主题:重发二叉树的各种算法(顶的加分)
包括了各种遍历,搜索路径,交换子树,求树的深度,叶子树
还有线索二叉树的生成。用相对符合课本的形式写的。
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAX 100
#define MAXSIZE 100
typedef int Status;
typedef char ElemType;
typedef struct BitNode/* 定义二叉树机构 */
{
ElemType data;
struct BitNode *lchild,*rchild;
}BitNode,*BiTree;
typedef struct Queue/* 定义队列 */
{
BiTree *base;
int front,rear;
}Queue;
Status InitQueue(Queue *Q)/* 初始化队列 */
{
Q->base=(BiTree *)malloc(MAXSIZE*sizeof(BiTree));
if(!Q->base) return ERROR;
Q->front=Q->rear=0;
return OK;
}
Status QueueEmpty(Queue *Q)/* 队列判空 */
{
if(Q->front==Q->rear) return 1;
return 0;
}
Status EnQueue(Queue *Q,BiTree e)/* 入队 */
{
if((Q->rear+1)%MAXSIZE==Q->front) return ERROR;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(Queue *Q,BiTree *e)/* 出队 */
{
if(Q->rear==Q->front) return ERROR;
(*e)=Q->base[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return OK;
}
Status PrintElement(ElemType e)/* 最简单的Visit函数 */
{
printf("%c",e);
return OK;
}
Status CreateBiTree(BiTree *T)/* 创建二叉树 */
{
ElemType ch;
scanf("%c",&ch);
if(ch==' ') (*T)=NULL;
else
{
if(!((*T)=(BitNode *)malloc(sizeof(BitNode)))) exit (OVERFLOW);
(*T)->data=ch;
(*T)->lchild=(*T)->rchild=NULL;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
return OK;
}
Status PreOrderTraverse(BiTree T,Status(*Visit)(ElemType e))/* 先序遍历 */
{
if(T)
{
if(!Visit(T->data)) exit(ERROR);
PreOrderTraverse(T->lchild,Visit);
PreOrderTraverse(T->rchild,Visit);
}
return OK;
}
Status InOrderTraverse(BiTree T,Status(*Visit)(ElemType e))/* 中序遍历 */
{
if(T)
{
InOrderTraverse(T->lchild,Visit);
if(!Visit(T->data)) exit(ERROR);
InOrderTraverse(T->rchild,Visit);
}
return OK;
}
Status PostOrderTraverse(BiTree T,Status(*Visit)(ElemType e))/* 后序遍历 */
{
if(T)
{
PostOrderTraverse(T->lchild,Visit);
PostOrderTraverse(T->rchild,Visit);
if(!Visit(T->data)) exit(ERROR);
}
return OK;
}
Status PreOrderTraverse_None_Recursion(BiTree T,Status(*Visit)(ElemType e))/* 先序非递归 */
{
BiTree p=T,Stack[MAX];
int top=0;
while (p|| top>0)
{
while (p)
{
if(!Visit(p->data)) exit(ERROR);
Stack[top++]=p;
p=p->lchild;
}
if (top>0)
{
p=Stack[--top];
p=p->rchild;
}
}
return OK;
}
还有线索二叉树的生成。用相对符合课本的形式写的。
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAX 100
#define MAXSIZE 100
typedef int Status;
typedef char ElemType;
typedef struct BitNode/* 定义二叉树机构 */
{
ElemType data;
struct BitNode *lchild,*rchild;
}BitNode,*BiTree;
typedef struct Queue/* 定义队列 */
{
BiTree *base;
int front,rear;
}Queue;
Status InitQueue(Queue *Q)/* 初始化队列 */
{
Q->base=(BiTree *)malloc(MAXSIZE*sizeof(BiTree));
if(!Q->base) return ERROR;
Q->front=Q->rear=0;
return OK;
}
Status QueueEmpty(Queue *Q)/* 队列判空 */
{
if(Q->front==Q->rear) return 1;
return 0;
}
Status EnQueue(Queue *Q,BiTree e)/* 入队 */
{
if((Q->rear+1)%MAXSIZE==Q->front) return ERROR;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(Queue *Q,BiTree *e)/* 出队 */
{
if(Q->rear==Q->front) return ERROR;
(*e)=Q->base[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return OK;
}
Status PrintElement(ElemType e)/* 最简单的Visit函数 */
{
printf("%c",e);
return OK;
}
Status CreateBiTree(BiTree *T)/* 创建二叉树 */
{
ElemType ch;
scanf("%c",&ch);
if(ch==' ') (*T)=NULL;
else
{
if(!((*T)=(BitNode *)malloc(sizeof(BitNode)))) exit (OVERFLOW);
(*T)->data=ch;
(*T)->lchild=(*T)->rchild=NULL;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
return OK;
}
Status PreOrderTraverse(BiTree T,Status(*Visit)(ElemType e))/* 先序遍历 */
{
if(T)
{
if(!Visit(T->data)) exit(ERROR);
PreOrderTraverse(T->lchild,Visit);
PreOrderTraverse(T->rchild,Visit);
}
return OK;
}
Status InOrderTraverse(BiTree T,Status(*Visit)(ElemType e))/* 中序遍历 */
{
if(T)
{
InOrderTraverse(T->lchild,Visit);
if(!Visit(T->data)) exit(ERROR);
InOrderTraverse(T->rchild,Visit);
}
return OK;
}
Status PostOrderTraverse(BiTree T,Status(*Visit)(ElemType e))/* 后序遍历 */
{
if(T)
{
PostOrderTraverse(T->lchild,Visit);
PostOrderTraverse(T->rchild,Visit);
if(!Visit(T->data)) exit(ERROR);
}
return OK;
}
Status PreOrderTraverse_None_Recursion(BiTree T,Status(*Visit)(ElemType e))/* 先序非递归 */
{
BiTree p=T,Stack[MAX];
int top=0;
while (p|| top>0)
{
while (p)
{
if(!Visit(p->data)) exit(ERROR);
Stack[top++]=p;
p=p->lchild;
}
if (top>0)
{
p=Stack[--top];
p=p->rchild;
}
}
return OK;
}