#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 100
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE 1
#define FALSE 0
#define true 1
#define false 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define OPSETSIZE 7
#define MAXQSIZE 100 typedef char TelemType;
typedef int Status;
typedef struct BiTNode
{
TelemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
typedef BiTree SElemType; typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
} SqStack; Status InitStack(SqStack *S);
Status Push(SqStack *S, SElemType e);
Status Pop(SqStack *S, SElemType *e);
Status StackEmpty(SqStack S);
Status CreateBiTree(BiTree *T);
Status PrintElement(TelemType e);
Status visit(TelemType e);
Status PreorderTraverse(BiTree T, Status (*visit)(TelemType e));
Status InorderTraverse(BiTree T, Status (*visit)(TelemType e));
Status PostorderTraverse(BiTree T, Status (*visit)(TelemType e)); int main()
{
BiTree T;
CreateBiTree(&T);
printf("PreorderTraverse:");
PreorderTraverse(T, visit);
printf("\nInorderTraverse_1:");
InorderTraverse(T, visit);
printf("\nInorderTraverse_2:");
InorderTraverse2(T, visit);
printf("\nPostorderTraverse:");
PostorderTraverse(T, visit);
return 0;
} Status InitStack(SqStack *S)
{
S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof (SElemType));
if (!S->base) exit (OVERFLOW);
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack *S, SElemType e)
{
if (S->top - S->base >= S->stacksize) //栈满
{
S->base = (SElemType *)realloc
(S->base, (S->stacksize + STACKINCREMENT)
* sizeof(SElemType));
if (!S->base) exit (OVERFLOW);
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
} // if
*S->top++ = e;
return OK;
} //Push
Status Pop(SqStack *S, SElemType *e)
{
if(S->top == S->base)return ERROR;
*e = *--S->top;
return OK;
} //Pop
Status StackEmpty(SqStack S)
{
if (S.base == S.top)
return TRUE;
return FALSE;
} Status CreateBiTree(BiTree *T)
{
char ch;
ch = getchar();
if (ch == ' ')
*T = NULL;
else
{
if (!(*T = (BiTNode *) malloc(sizeof (BiTNode))))
exit(OVERFLOW);
(*T)->data = ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
return OK;
} Status PrintElement(TelemType e)
{
printf("%c ", e);
return OK;
}
Status visit(TelemType e)
{
printf("%c ", e);
return OK;
}
Status PreorderTraverse(BiTree T, Status (*visit)(TelemType e))
{
if (T)
{
if (visit(T->data))
if (PreorderTraverse(T->lchild, visit))
if (PreorderTraverse(T->rchild, visit)) return OK;
return ERROR;
}
return OK;
} Status InorderTraverse(BiTree T, Status (*visit)(TelemType e) )
{
if (T)
{
if (InorderTraverse(T->lchild, visit))
if (visit(T->data))
if (InorderTraverse(T->rchild, visit)) return OK;
return ERROR;
}
return OK;
} Status InorderTraverse2(BiTree T, Status (*visit)(TelemType e))
{
SqStack S;
InitStack(&S);
BiTree p = T;
while( p || !StackEmpty(S) )
{
while (p)
{
Push(&S, p);
p = p -> lchild;
}
if( !StackEmpty(S))
{
Pop(&S, &p);
if (!visit(p -> data))
return ERROR;
p = p -> rchild;
}
}
return OK;
} Status PostorderTraverse(BiTree T, Status (*visit)(TelemType e))
{
if (T)
{
if (PostorderTraverse(T->lchild, visit))
if (PostorderTraverse(T->rchild, visit))
if (visit(T->data)) return OK;
return ERROR;
}
return OK;
}

最新文章

  1. Android面试题(一)
  2. java中字节流与字符流的区别
  3. 缓存Cache
  4. PHP之PhpDocument的使用
  5. Coding the Matrix (3):矩阵
  6. 【CodeForces 621B】Wet Shark and Bishops
  7. 第十三章 调试及安全性(In .net4.5) 之 验证程序输入
  8. 《架构探险——从零开始写Java Web框架》这书不错,能看懂的入门书
  9. CSS模块化
  10. Qt 读写XML文件
  11. ExtJS实例1
  12. IOS基于新浪微博开放平台微博APP
  13. Pros and Cons of T4 in Visual Studio 2008
  14. App引导页面源代码的实现
  15. Redis中的master-slave&amp;sentinel
  16. 洛谷P3233 [HNOI2014]世界树
  17. supersocket 遇到的Failed to initialize 和 log4net用法
  18. 解决MySQL5.7密码重置问题
  19. 2013年蓝桥杯省赛C/C++A组真题解析
  20. CiscoIOUKeygen

热门文章

  1. 5 - 参考函数-API
  2. Spring Junit测试(非web,即不包含Controller测试)
  3. java注解相关
  4. Docker for mac 安装 kong
  5. springcloud中servcie层调用fegin异常以及异步方法的实现
  6. synchronized重入后抛出异常,锁释放了吗
  7. Java调用SQL Server的存储过程详解(转)
  8. zblog添加水印插件后出现Cannot use $this as parameter
  9. scanner/portscan/syn
  10. Python 加持,给你更有趣的 Azure 虚拟机开关重启方法!