二叉树 c

来源:互联网 发布:python中 变量类型 编辑:程序博客网 时间:2024/06/07 05:22
/* ds.h *//* Some pre define */#ifndef _HS_H#define _HS_H#include <string.h>#include <ctype.h>#include <sys/malloc.h>#include <stdio.h>#include <stdlib.h>/* State code */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW 0typedef int Status;typedef int Boolean;#endif
// binaryTree0.c#include "ds.h"#include <stdio.h>#define STACK_INIT_SIZE 10 // initial stack size#define STACKINCREMENT 4typedef int TElemType;typedef struct BiTNode{  TElemType data;  struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;typedef BiTree SElemType;// stack data structure// prepare for traverse without recursiontypedef 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;}// preorder scanf// -1 to stopvoid 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);  }}// return 1, for empty BiTree// 0, for nonemptyStatus BiTreeEmpty(BiTree T){  return(T == NULL);}// return BiTree depthint 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);  }}// print BiTreevoid 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;  }}// post order traverse BiTreevoid PostOrderTraverse(BiTree T, Status(* Visit)(TElemType)){  if(T){    PostOrderTraverse(T->lchild, Visit);    PostOrderTraverse(T->rchild, Visit);    Visit(T->data);  }}// In order traverse BiTreevoid InOrderTraverse(BiTree T, Status(* Visit)(TElemType)){  if(T){    InOrderTraverse(T->lchild, Visit);    Visit(T->data);    InOrderTraverse(T->rchild, Visit);  }}// Pre order traverse BiTreevoid PreOrderTraverse(BiTree T, Status(* Visit)(TElemType)){  if(T){    Visit(T->data);    PreOrderTraverse(T->lchild, Visit);    PreOrderTraverse(T->rchild, Visit);  }}// stack initializerint 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;}// return 1, if stack is empty// retunr 0, otherwiseStatus StackEmpty(SqStack s){  return (s.top == s.base);}// pop opsStatus Pop(SqStack *s, SElemType *e){  if(s->top == s->base)return ERROR;  else{    // printf("test\n");    s->top--;    *e = *s->top;    // printf("%d", (*e)->data);    return OK;  }}// push opsStatus Push(SqStack *s, SElemType e){  if(s->top - s->base >= s->stacksize){    // if stack is full    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;  // printf("test: %d", e->data);  s->top++;  return OK;}// In order traverse, without recursion// using stackStatus InOrderTraverse1(BiTree T, Status(* Visit)(TElemType)){  SqStack s;  InitStack(&s);  // printf("Initial stack.\n");  while(T || !StackEmpty(s)){    if(T){      // push root, traverse left child      // printf("Push \n");      Push(&s, T);      T = T->lchild;    }else{      // printf("Pop\n");      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 -11  -2  -3   -4In order traverse(recursion) 2 1 4 3 In order traverse(stack) 2 1 4 3 
原创粉丝点击