二叉树 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
阅读全文
0 0
- C语言版--二叉树
- btree-C二叉树
- 数据结构(C++)--二叉树
- C二叉树
- C语言版--二叉树
- 二叉查找树(C#)
- C语言 二叉树
- c的二叉树
- 二叉树 c实现
- 二叉树(数据结构 c++)
- c语言 二叉树
- 二叉树(C++)
- [c]二叉树
- 【数据结构】二叉树(c++)
- 二叉树(C语言)
- 二叉搜索树(c++)
- [C++]二叉树总结
- <<c>>二叉查找树
- Spring Integration 系统集成
- Android 了解1G 2G 3G 知识
- ResourceManager(三)—— Request,ResourceAsyncOperation
- 如何走进Tomcat源码的探究
- Lintcode主元素
- 二叉树 c
- [BZOJ]1969: [Ahoi2005]LANE 航线规划 离线树链剖分
- 浅谈ViewPager+Fragment的使用和理解
- 学习C语言|CSDN的第0天 + 我是如何走上编程之路的
- jsp通过include指令引入html乱码的解决方法
- 【深入PHP 面向对象】读书笔记(十一)
- 【肠道生态】-CS0001-《消失的微生物》
- (crm笔记1-7)搭建好框架后对dao层进行功能扩充
- Oracle客户端的sqlplus登录Windows Oracle数据库服务器端缓慢