您的位置:首页 > 理论基础 > 数据结构算法

严蔚敏 数据结构 二叉树 代码C语言实现 用C++编译器运行

2012-06-07 17:19 856 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define OK 0;
#define ERROR -1
#define OVERFLOW -2
#define YES 1
#define NO 0

#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10

typedef int Status;
typedef int TElemType;

//二叉树的顺序存储结构
#define MaxTreeSize 101
typedef TElemType BiTreeArr[MaxTreeSize];
BiTreeArr bt;

//二叉树的链式存储结构
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTreeLk;

typedef BiTreeLk SElemType;

//@@@@@@@@@@@@@@@@@@@
//栈的数据结构部分开始

typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;

//初始化栈
Status InitStack(SqStack &S)
{
S.base = (SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
if(!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}

//得到栈顶元素
Status GetTop(SqStack &S,SElemType &e)
{
if(S.top==S.base)
return ERROR;
e = *(S.top-1);
return OK;
}

//压栈
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)
{
S.base= (SElemType *)realloc(S.base, sizeof(SElemType)*(S.stacksize+STACK_INCREMENT));
if(!S.base)
return ERROR;
S.top = S.base+S.stacksize;
S.stacksize += STACK_INCREMENT;
}
*S.top++ = e;
return OK;
}

//出栈
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base)
return ERROR;
S.top--;
e = *S.top; return OK;
}

Status StackEmpty(SqStack &S)
{
if(S.base == S.top)
return YES;
return NO;
}

//栈的数据结构部分结束
//@@@@@@@@@@@@@@@@@@@@@@@@@@@

Status Visit(TElemType data)
{
if(&data==NULL)
{
return ERROR;
}
else
{
printf("    %d",data);
return OK;
}
}

//采用递归算法的先序、中序和后序遍历算法
//先序递归便利算法
Status PreOrderTraverse( BiTreeLk T, Status(*Visit)(TElemType) )
{
if(T)
{
if(Visit(T->data))
if(PreOrderTraverse(T->lchild, Visit))
if (PreOrderTraverse(T->rchild, Visit))
return OK;
return ERROR;
}
else
return OK;
}
//中序递归遍历算法
Status InOrderTraverse( BiTreeLk T, Status(*Visit)(TElemType) )
{
if(T)
{
if(PreOrderTraverse(T->lchild, Visit))
if(Visit(T->data))
if (PreOrderTraverse(T->rchild, Visit))
return OK;
return ERROR;
}
else
return OK;
}
//后序递归遍历算法
Status PostOrderTraverse( BiTreeLk T, Status(*Visit)(TElemType) )
{
if(T)
{
if(PreOrderTraverse(T->lchild, Visit))
if (PreOrderTraverse(T->rchild, Visit))
if(Visit(T->data))
return OK;
return ERROR;
}
else
return OK;
}

//非递归的二叉树中序遍历算法
//大体的思路是保存在遍历树时走过的路径,节点弹出的顺序即为节点访问的顺序
Status InOrderTraverse1(BiTreeLk T,Status(*Visit)(TElemType e))
{
SqStack S;
BiTreeLk p;
InitStack(S);               //初始化一个栈
Push(S,T);                  //将根节点压入栈中
while(!StackEmpty(S))       //满足栈不空的条件
{
while(GetTop(S,p)&&p)   //获取栈的最上面的指针
Push(S,p->lchild);  //向左走到尽头,将这条线路上的点都压入栈中
Pop(S,p);               //弹出入栈的空指针
if(!StackEmpty(S))      //如果栈不为空
{
Pop(S,p);           //弹出一个节点指针
if(!Visit(p->data)) //访问这个节点
return ERROR;
Push(S,p->rchild);  //将其右节点入栈
}
}
}

//非递归的二叉树中序遍历算法
Status InOrderTraverse2(BiTreeLk T, Status (*Visit)(TElemType e))
{
SqStack S;
InitStack(S);
BiTreeLk p = T;
while(p||!StackEmpty(S))
{
if(p)
{
Push(S,p);
p = p->lchild;
}
else
{
Pop(S,p);
if(!Visit(p->data))
return ERROR;
p = p->rchild;
}
}
return OK;
}

Status CreateBitreeLk(BiTreeLk &T)
{
char ch;
scanf("%c",ch);
if(ch==' ')
T = NULL;
else
{
if(!(T=(BiTreeLk)malloc(sizeof(BiTNode))))
return ERROR;
T->data = ch;
CreateBitreeLk(T->lchild);
CreateBitreeLk(T->rchild);
}
return OK;
}

int main()
{
//Todo functions is here
//test the data structure above using the sampes of " A  B C @ @ D E @ g @ @ f @ @ @ "
//'@' denote the empty character
BiTreeLk T;
CreateBitreeLk(T);
InOrderTraverse1(T,Visit);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐