严蔚敏 数据结构 二叉树 代码C语言实现 用C++编译器运行
2012-06-07 17:19
856 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> #define OK 0; #define ERROR -1 #define OVERFLOW -2 #define YES 1 #define NO 0 #define STACK_INIT_SIZE 100 #define STACK_INCREMENT 10 typedef int Status; typedef int TElemType; //二叉树的顺序存储结构 #define MaxTreeSize 101 typedef TElemType BiTreeArr[MaxTreeSize]; BiTreeArr bt; //二叉树的链式存储结构 typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTreeLk; typedef BiTreeLk SElemType; //@@@@@@@@@@@@@@@@@@@ //栈的数据结构部分开始 typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; //初始化栈 Status InitStack(SqStack &S) { S.base = (SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE); if(!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; } //得到栈顶元素 Status GetTop(SqStack &S,SElemType &e) { if(S.top==S.base) return ERROR; e = *(S.top-1); return OK; } //压栈 Status Push(SqStack &S,SElemType e) { if(S.top-S.base>=S.stacksize) { S.base= (SElemType *)realloc(S.base, sizeof(SElemType)*(S.stacksize+STACK_INCREMENT)); if(!S.base) return ERROR; S.top = S.base+S.stacksize; S.stacksize += STACK_INCREMENT; } *S.top++ = e; return OK; } //出栈 Status Pop(SqStack &S,SElemType &e) { if(S.top==S.base) return ERROR; S.top--; e = *S.top; return OK; } Status StackEmpty(SqStack &S) { if(S.base == S.top) return YES; return NO; } //栈的数据结构部分结束 //@@@@@@@@@@@@@@@@@@@@@@@@@@@ Status Visit(TElemType data) { if(&data==NULL) { return ERROR; } else { printf(" %d",data); return OK; } } //采用递归算法的先序、中序和后序遍历算法 //先序递归便利算法 Status PreOrderTraverse( BiTreeLk T, Status(*Visit)(TElemType) ) { if(T) { if(Visit(T->data)) if(PreOrderTraverse(T->lchild, Visit)) if (PreOrderTraverse(T->rchild, Visit)) return OK; return ERROR; } else return OK; } //中序递归遍历算法 Status InOrderTraverse( BiTreeLk T, Status(*Visit)(TElemType) ) { if(T) { if(PreOrderTraverse(T->lchild, Visit)) if(Visit(T->data)) if (PreOrderTraverse(T->rchild, Visit)) return OK; return ERROR; } else return OK; } //后序递归遍历算法 Status PostOrderTraverse( BiTreeLk T, Status(*Visit)(TElemType) ) { if(T) { if(PreOrderTraverse(T->lchild, Visit)) if (PreOrderTraverse(T->rchild, Visit)) if(Visit(T->data)) return OK; return ERROR; } else return OK; } //非递归的二叉树中序遍历算法 //大体的思路是保存在遍历树时走过的路径,节点弹出的顺序即为节点访问的顺序 Status InOrderTraverse1(BiTreeLk T,Status(*Visit)(TElemType e)) { SqStack S; BiTreeLk p; InitStack(S); //初始化一个栈 Push(S,T); //将根节点压入栈中 while(!StackEmpty(S)) //满足栈不空的条件 { while(GetTop(S,p)&&p) //获取栈的最上面的指针 Push(S,p->lchild); //向左走到尽头,将这条线路上的点都压入栈中 Pop(S,p); //弹出入栈的空指针 if(!StackEmpty(S)) //如果栈不为空 { Pop(S,p); //弹出一个节点指针 if(!Visit(p->data)) //访问这个节点 return ERROR; Push(S,p->rchild); //将其右节点入栈 } } } //非递归的二叉树中序遍历算法 Status InOrderTraverse2(BiTreeLk T, Status (*Visit)(TElemType e)) { SqStack S; InitStack(S); BiTreeLk p = T; while(p||!StackEmpty(S)) { if(p) { Push(S,p); p = p->lchild; } else { Pop(S,p); if(!Visit(p->data)) return ERROR; p = p->rchild; } } return OK; } Status CreateBitreeLk(BiTreeLk &T) { char ch; scanf("%c",ch); if(ch==' ') T = NULL; else { if(!(T=(BiTreeLk)malloc(sizeof(BiTNode)))) return ERROR; T->data = ch; CreateBitreeLk(T->lchild); CreateBitreeLk(T->rchild); } return OK; } int main() { //Todo functions is here //test the data structure above using the sampes of " A B C @ @ D E @ g @ @ f @ @ @ " //'@' denote the empty character BiTreeLk T; CreateBitreeLk(T); InOrderTraverse1(T,Visit); return 0; }
相关文章推荐
- 严蔚敏 数据结构 栈 代码C语言实现 用C++编译器运行
- 堆排序 HeapSort C语言实现 附严蔚敏数据结构P282 代码错误
- 数据结构(严蔚敏)之五——循环队列(c语言实现)
- 栈的实现 (数据结构 严蔚敏 清华大学出版社 第三章 抽象数据类型 成功编译并运行)
- C++类模板 实现队列的链式存储结构算法 《数据结构》(北京科海) 部分代码摘抄,自己编写运行
- Java二叉树的编程实现(数据结构)和正则表达式代码实现
- c语言-数据结构-二叉树-生成、遍历代码
- 4000 《数据结构》(严蔚敏)算法代码实现第二章
- [数据结构]C语言二叉树的实现
- 数据结构C语言实现之链式队列的6种算法代码
- 数据结构 严蔚敏 清华大学出版社 第一章 抽象数据类型 三元组的实现 成功编译并运行
- C语言实现Huffman Tree(参考严蔚敏《数据结构》部分伪码)
- 数据结构(二叉树子系统:c语言实现)
- 数据结构:树tree和二叉树BinaryTree的实现与代码分析
- 【数据结构】数据结构C语言的实现(简单二叉树)
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-3-出错处理模块和运行日志模块
- 树的三种遍历方法代码实现 (数据结构)C语言
- 算法与数据结构-二叉树的基本操作C语言实现
- 数据结构 严蔚敏 清华大学出版社 第二章 抽象数据类型 链表的实现 成功编译并运行
- 小蚂蚁学习数据结构(24)——求二叉树深度和度为2的节点个数代码实现