




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/*/二叉树在 C 语言中的实现与应用/*/ #include <stdio.h>#include <stdlib.h> #define STACK_MAX_SIZE 30#define QUEUE_MAX_SIZE 30 #ifndef elemType typedef char elemType;#endif/*/ /* 以下是关于二叉树操作的 11 个简单算法 */*/ struct BTreeNode elemType data;struct BTreeNode *left; struct BTreeNode *right;/* 1. 初始化二叉树 */void
2、 initBTree(struct BTreeNode* *bt)*bt = NULL;return;/* 2.建立二叉树(根据a所指向的二叉树广义表字符串建立)*/void createBTree(struct BTreeNode* *bt, char *a)struct BTreeNode *p;struct BTreeNode *sSTACK_MAX_SIZE;/* 定义 s 数组为存储根结点指针的栈使用 */int top = -1; /* 定义 top 作为 s 栈的栈顶指针,初值为 -1, 表示空栈 */int k; /* 用 k 作为处理结点的左子树和右子树, k = 1 处理左
3、子树, k = 2 处理右子树 */int i = 0; /* 用i扫描数组a中存储的二叉树广义表字符串,初值为 0 */*bt = NULL; /* 把树根指针置为空,即从空树开始建立二叉树 */* 每循环一次处理一个字符,直到扫描到字符串结束符 0 为止 */while(ai != '0')switch(ai)case ' ':break; /* 对空格不作任何处理 */case '(':if(top = STACK_MAX_SIZE - 1)printf(" 栈空间太小! n");exit(1);top+; stop =
4、 p;k = 1;break; case ')':if(top = -1)printf(" 二叉树广义表字符串错误 !n"); exit(1); top-; break;case ',': k = 2; break; default: p = new BTreeNode ; p->data = ai;p->left = p->right = NULL; if(*bt = NULL) *bt = p;elseif( k = 1) stop->left = p;else stop->right = p;i+; /*
5、为扫描下一个字符修改 i 值 */ return;/* 3. 检查二叉树是否为空,为空则返回 1,否则返回 0 */ int emptyBTree(struct BTreeNode *bt)if(bt = NULL)return 1;elsereturn 0;/* 4. 求二叉树深度 */int BTreeDepth(struct BTreeNode *bt)if(bt = NULL)return 0; /* 对于空树,返回 0 结束递归 */ elseint dep1 = BTreeDepth(bt->left); /* int dep2 = BTreeDepth(bt->rig
6、ht); /* if(dep1 > dep2) return dep1 + 1;elsereturn dep2 + 1;计算左子树的深度 */计算右子树的深度 */若存在则返回元素存储位置,否则返回空值 */* 5. 从二叉树中查找值为 x 的结点, elemType *findBTree(struct BTreeNode *bt, elemType x) if(bt = NULL) return NULL;else if(bt->data = x) return &(bt->data);else /* 分别向左右子树递归查找 */ elemType *p;if(p
7、= findBTree(bt->left, x) return p;if(p = findBTree(bt->right, x) return p; return NULL; /* 6. 输出二叉树 (前序遍历) */ void printBTree(struct BTreeNode *bt) /* 树为空时结束递归,否则执行如下操作 */ if(bt != NULL)printf("%c", bt->data); /* 输出根结点的值 */ if(bt->left != NULL | bt->right != NULL) printf(&qu
8、ot;(");printBTree(bt->left); if(bt->right != NULL) printf(","); printBTree(bt->right); printf(")"); return;/* 7. 清除二叉树,使之变为一棵空树 */void clearBTree(struct BTreeNode* *bt)if(*bt != NULL) clearBTree(&(*bt)->left); clearBTree(&(*bt)->right); free(*bt);*bt =
9、 NULL;return;/* 8. 前序遍历 */void preOrder(struct BTreeNode *bt) if(bt != NULL) printf("%c ", bt->data); /* preOrder(bt->left); /* preOrder(bt->right); /* return;访问根结点 */ 前序遍历左子树 */ 前序遍历右子树 */* 9. 前序遍历 */void inOrder(struct BTreeNode *bt) if(bt != NULL) inOrder(bt->left); /* print
10、f("%c ", bt->data); /* inOrder(bt->right); /* return;中序遍历左子树 */ 访问根结点 */ 中序遍历右子树 */* 10. 后序遍历 */ void postOrder(struct BTreeNode *bt) if(bt != NULL) postOrder(bt->left); /* postOrder(bt->right); /* printf("%c ", bt->data); /* return;后序遍历左子树 */ 后序遍历右子树 */ 访问根结点 */*
11、11. 按层遍历 */void levelOrder(struct BTreeNode *bt) struct BTreeNode *p;struct BTreeNode *qQUEUE_MAX_SIZE;int front = 0, rear = 0;/* 将树根指针进队 */ if(bt != NULL) rear = (rear + 1) % QUEUE_MAX_SIZE; qrear = bt;使队首指针指向队首元素 */ while(front != rear) /*队列非空 */front = (front + 1) % QUEUE_MAX_SIZE; /* p = qfront;
12、 printf("%c ", p->data);/* 若结点存在左孩子,则左孩子结点指针进队 */ if(p->left != NULL)rear = (rear + 1) % QUEUE_MAX_SIZE;#include <stdio.h> #include <stdlib.h> #define STACK_MAX_SIZE 30#define QUEUE_MAX_SIZE 30 #ifndef elemType typedef char elemType ;#endif /*/* 以下是关于二叉树操作的 11 个简单算法 */*/s
13、truct BTreeNodeelemType data ;struct BTreeNode *left ;struct BTreeNode *right ;/* 1. 初始化二叉树 */void initBTree(struct BTreeNode* *bt)*bt = NULL ;return ;/* 2.建立二叉树(根据a所指向的二叉树广义表字符串建立)*/ void createBTree(struct BTreeNode* *bt, char *a)struct BTreeNode *p;struct BTreeNode *sSTACK_MAX_SIZE;/* 定义 s 数组为存储根
14、结点指针的栈使用 */int top = -1; /* 定义 top 作为 s 栈的栈顶指针,初值为 -1, 表示空栈 */int k ; /* 用k作为处理结点的左子树和右子树,k = 1处理左子树,k = 2处理右子树*/int i = 0 ; /* 用i扫描数组a中存储的二叉树广义表字符串,初值为 0 */*bt = NULL ; /* 把树根指针置为空,即从空树开始建立二叉树 */* 每循环一次处理一个字符,直到扫描到字符串结束符 0 为止 */ while(ai != '0')switch(ai)case ' ':break; /* 对空格不作任何处理
15、 */case '(':if( top = STACK_MAX_SIZE - 1 )printf(" 栈空间太小! n") ; exit(1) ;top+ ; stop = p ;k = 1 ;break;case ')':if(top = -1)printf(" 二叉树广义表字符串错误 !n"); exit(1); top- ;break ; case ',':k = 2;break; default: p = new BTreeNode ; p->data = ai ;p->left = p
16、->right = NULL ; if( *bt = NULL)*bt = p ;elseif( k = 1) stop->left = p ;else stop->right = p ;i+ ; /* 为扫描下一个字符修改 i 值 */ return;/* 3. 检查二叉树是否为空,为空则返回 1,否则返回 0 */ int emptyBTree(struct BTreeNode *bt)if(bt = NULL)return 1;elsereturn 0;/* 4. 求二叉树深度 */int BTreeDepth(struct BTreeNode *bt)计算左子树的深度
17、 */ 计算右子树的深度 */ if(bt = NULL) return 0; /* 对于空树,返回 0 结束递归 */ elseint dep1 = BTreeDepth(bt->left); /* int dep2 = BTreeDepth(bt->right); /* if(dep1 > dep2) return dep1 + 1; else return dep2 + 1; */* 5. 从二叉树中查找值为 x 的结点,若存在则返回元素存储位置,否则返回空值 elemType *findBTree(struct BTreeNode *bt, elemType x)if
18、(bt = NULL)return NULL;else if(bt->data = x) return &(bt->data);else /* 分别向左右子树递归查找 */ elemType *p ;if(p = findBTree(bt->left, x)return p ;if(p = findBTree(bt->right, x)return p ;return NULL ;/* 6. 输出二叉树 (前序遍历) */ void printBTree(struct BTreeNode *bt) */* 树为空时结束递归,否则执行如下操作 if(bt != N
19、ULL) printf("%c ", bt->data); /*输出根结点的值 */if(bt->left != NULL | bt->right != NULL) printf("(") ; printBTree(bt->left) ; if(bt->right != NULL) printf(",") ; printBTree(bt->right) ; printf(")"); return;/* 7. 清除二叉树,使之变为一棵空树 */ void clearBTree(st
20、ruct BTreeNode* *bt) if(*bt != NULL) clearBTree(&(*bt)->left) ; clearBTree(&(*bt)->right) ; free(*bt) ;*bt = NULL ;return ;/* 8. 前序遍历 */void preOrder(struct BTreeNode *bt) 访问根结点 */ 前序遍历左子树 */ 前序遍历右子树 */if(bt != NULL) printf("%c ", bt->data) ; /* preOrder(bt->left) ; /*
21、preOrder(bt->right) ; /* return ;/* 9. 中序遍历 */ void inOrder(struct BTreeNode *bt) if(bt != NULL) inOrder(bt->left); /* printf("%c ", bt->data); /* inOrder(bt->right); /* return;中序遍历左子树 */ 访问根结点 */ 中序遍历右子树 */* 10. 后序遍历 */ void postOrder(struct BTreeNode *bt) if(bt != NULL) postO
22、rder(bt->left); /* postOrder(bt->right); /* printf("%c ", bt->data); /* return;后序遍历左子树 */ 后序遍历右子树 */ 访问根结点 */* 11. 按层遍历 */void levelOrder(struct BTreeNode *bt)struct BTreeNode *p;struct BTreeNode *qQUEUE_MAX_SIZE;int front = 0, rear = 0;/* 将树根指针进队 */if(bt != NULL)rear = (rear + 1)
23、 % QUEUE_MAX_SIZE; qrear = bt;while(front != rear) /*队列非空 */front = (front + 1) % QUEUE_MAX_SIZE; /* p = qfront;printf("%c ", p->data);/* 若结点存在左孩子,则左孩子结点指针进队 if(p->left != NULL)rear = (rear + 1) % QUEUE_MAX_SIZE; qrear = p->left;/* 若结点存在右孩子,则右孩子结点指针进队 if(p->right != NULL)rear =
24、 (rear + 1) % QUEUE_MAX_SIZE; qrear = p->right;使队首指针指向队首元素 */*/*/return;/*/int main(int argc, char *argv) struct BTreeNode *bt ; /*指向二叉树根结点的指针 */char *b ; /*用于存入二叉树广义表的字符串 */elemType x, *px ;initBTree(&bt) ; printf(" 输入二叉树广义表的字符串: n") ;/* scanf("%s", b); */ b = "a(b(c), d(e(f, g), h(, i)"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年农村环境治理工程项目经理面试技巧与题目解析
- 2025年市场营销师认证考试模拟卷及解析
- 护理心理学3试题及答案
- 贵阳市村民管理办法
- 2025年中国石油天然气集团招聘面试攻略及模拟题答案
- 医疗机构环境表面清洁与消毒规范考试题(含答案)
- 医疗十八项核心制度考核试题(附答案)
- 山东省莱芜市钢城新兴路学校高中英语 Module5 TheFourth Period Listening说课稿 外研版必修5
- 设备及材料管理办法
- 2025年外贸业务员实操经验与面试模拟题集
- 老板和店长协议书范本
- 2025-2030中国眼用药物输送技术行业市场发展趋势与前景展望战略研究报告
- 2025至2030中国黑水虻养殖行业经营规模分析及投资风险预警报告
- 2025年中学教师资格考试《综合素质》核心考点特训题库(含答案)之教育心理学试题
- 人教版劳动教育四年级上册全册教学设计
- 矿物加工工程专业英语词汇
- T-ZSA 288-2024 餐饮设备智能烹饪机器人系统通.用技术要求
- 档案员近3年年终工作考核情况
- 《建筑材料与构造》课件-1.建筑材料认知
- 2024版济南厂房出租合同(含使用权转让)
- DBJ33T 1307-2023 微型钢管桩加固技术规程
评论
0/150
提交评论