二叉树 c 实现

/* binaryTreeMain.c */

// 
#define CHAR

#include "ds.h"

#ifdef CHAR
  typedef char TElemType;
  TElemType Nil=' ';
#endif
#ifdef INT
  typedef int TElemType;
  TElemType Nil=0;
#endif

#include "binaryTree.h"
#include "binaryTree.c"


int main(){
  // declare a pointer, not initialized, might be 0x0 of random
  BiTree T, p, c;
  InitBiTree(&T);
  CreateBiTree(&T);
  PreOrderTraverse(T, visit);

  return OK;
}
/* binaryTree.c */


/* Used as a parameter in traverse
 to print an element
*/
Status visit(TElemType e){
#ifdef CHAR
  printf("%c ", e);
#endif
#ifdef INT
  printf("%d ", e);
#endif
  return OK;
}

// Initial empty binary tree
Status InitBiTree(BiTree *T){
  *T = NULL;
  return OK;
}

/* Create binary tree
 Order of creat: node, left child, right child, which are inorder
 if data type is char, ' ' means stop
 if int, 0 means stop
*/
Status CreateBiTree(BiTree *T){
  TElemType data;
#ifdef CHAR
  scanf("%c", &data);
#endif

#ifdef INT
  scanf("%d", &data);
#endif

  if(data == Nil)
    *T = NULL;
  else{
    *T = (BiTree)malloc(sizeof(BiTNode));
    if(!*T)
      exit(OVERFLOW);
    (*T)->data = data;
    CreateBiTree(&(*T)->lchild);
    CreateBiTree(&(*T)->rchild);
  }
  return OK;
}

/* Destroy binary tree
 free memory allocated for tree
*/
void DestroyBiTree(BiTree *T){
  if(*T){
    if((*T)->lchild)
      DestroyBiTree(&(*T)->lchild);
    if((*T)->rchild)
      DestroyBiTree(&(*T)->rchild);
    free(*T);
    *T = NULL;
  }
}


// PreOrder traverse
void PreOrderTraverse(BiTree T, Status(*Visit)(TElemType e)){
  if(T){
    Visit(T->data);
    PreOrderTraverse(T->lchild, Visit);
    PreOrderTraverse(T->rchild, Visit);
  }
}

void InOrderTraverse(BiTree T, Status(*Visit)(TElemType e)){
  if(T){
    InOrderTraverse(T->lchild, Visit);
    Visit(T->data);
    InOrderTraverse(T->rchild, Visit);
  }
}

// Return deep of binary tree
int BiTreeDepth(BiTree T){
  int i, j;
  if(!T)
    return 0;
  if(T->lchild)
    i = BiTreeDepth(T->lchild);
  else
    i = 0;
  if(T->rchild)
    j = BiTreeDepth(T->rchild);
  else
    j = 0;
  return i > j?i + 1: j + 1;
}


/* Binary tree: linked list representation */

typedef struct BiTNode{
  TElemType data;
  struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

// Initial empty binary tree
Status InitBiTree(BiTree *T);

// Create binary tree
Status CreateBiTree(BiTree *T);

// Return Left child
TElemType LeftChild(BiTree T, TElemType e);

// PreOrder traverse
void PreOrderTraverse(BiTree T, Status(*Visit)(TElemType e));

// InOrder traverse
void InOrderTraverse(BiTree T, Status(*Visit)(TElemType e));

// Return deep of binary tree
int BiTreeDepth(BiTree T);
/* ds.h */
/* Some pre define */

#include <string.h>
#include <ctype.h>
#include <sys/malloc.h>
#include <stdio.h>
#include <stdlib.h>

/* State code */
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW 0

typedef int Status;
typedef int Boolean;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值