#ifndef _HS_H
#define _HS_H
#include <string.h>
#include <ctype.h>
#include <sys/malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW 0
typedef int Status;
typedef int Boolean;
#endif
#include "ds.h"
#include <stdio.h>
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 4
typedef int TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
typedef BiTree SElemType;
typedef struct SqStack{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status visit(TElemType e){
printf("%d ", e);
return OK;
}
Status InitBiTree(BiTree *T){
*T = NULL;
return OK;
}
void CreateBiTree(BiTree *T){
TElemType data;
scanf("%d", &data);
if(data == -1)
*T = NULL;
else{
*T = (BiTree)malloc(sizeof(BiTNode));
if(!*T)exit(OVERFLOW);
(*T)->data = data;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
Status BiTreeEmpty(BiTree T){
return(T == NULL);
}
int BiTreeDepth(BiTree T){
int i, j;
if(!T)return 0;
else{
i = BiTreeDepth(T->lchild);
j = BiTreeDepth(T->rchild);
return i>j?(i+1):(j+1);
}
}
void printBiTree(BiTree T, int depth){
if(T){
printf("%d", T->data);
if(T->lchild){
printf("\n");
printf("%*.s-", depth+1, "");
printBiTree(T->lchild, depth+1);
}
if(T->rchild){
printf("\n");
printf("%*.s-", depth+1, "");
printBiTree(T->rchild, depth+1);
}
}else{
return;
}
}
void PostOrderTraverse(BiTree T, Status(* Visit)(TElemType)){
if(T){
PostOrderTraverse(T->lchild, Visit);
PostOrderTraverse(T->rchild, Visit);
Visit(T->data);
}
}
void InOrderTraverse(BiTree T, Status(* Visit)(TElemType)){
if(T){
InOrderTraverse(T->lchild, Visit);
Visit(T->data);
InOrderTraverse(T->rchild, Visit);
}
}
void PreOrderTraverse(BiTree T, Status(* Visit)(TElemType)){
if(T){
Visit(T->data);
PreOrderTraverse(T->lchild, Visit);
PreOrderTraverse(T->rchild, Visit);
}
}
int 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 StackEmpty(SqStack s){
return (s.top == s.base);
}
Status Pop(SqStack *s, SElemType *e){
if(s->top == s->base)return ERROR;
else{
s->top--;
*e = *s->top;
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;
}
*(s->top) = e;
s->top++;
return OK;
}
Status InOrderTraverse1(BiTree T, Status(* Visit)(TElemType)){
SqStack s;
InitStack(&s);
while(T || !StackEmpty(s)){
if(T){
Push(&s, T);
T = T->lchild;
}else{
Pop(&s, &T);
if(!Visit(T->data))
return ERROR;
T = T->rchild;
}
}
printf("\n");
return OK;
}
int main(){
BiTree T;
InitBiTree(&T);
CreateBiTree(&T);
printBiTree(T, 1);
printf("\n");
printf("In order traverse(recursion) \n");
InOrderTraverse(T, visit);
printf("\n");
printf("In order traverse(stack) \n");
InOrderTraverse1(T, visit);
printf("\n");
}
Junr:tree junr$ ./a.out
1 2 -1 -1 3 4 -1 -1 -1
1
-2
-3
-4
In order traverse(recursion)
2 1 4 3
In order traverse(stack)
2 1 4 3