ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:18.10KB ,
资源ID:6912083      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6912083.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构C语言实现系列7二叉树.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构C语言实现系列7二叉树.docx

1、数据结构C语言实现系列7二叉树数据结构C语言实现系列7二叉树1#include #include #define STACK_MAX_SIZE 30#define QUEUE_MAX_SIZE 30#ifndef elemTypetypedef char elemType;#endif/*/* 以下是关于二叉树操作的11个简单算法 */*/ struct BTreeNodeelemType data;struct BTreeNode *left;struct BTreeNode *right;/* 1.初始化二叉树 */void initBTree(struct BTreeNode* *bt)

2、*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处理左子树,k = 2处理右子树 */int i = 0; /* 用i扫描数组a中存储的二叉树

3、广义表字符串,初值为0 */*bt = NULL; /* 把树根指针置为空,即从空树开始建立二叉树 */* 每循环一次处理一个字符,直到扫描到字符串结束符0为止 */while(ai != 0) switch(ai) case : break; /* 对空格不作任何处理 */ 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; ca

4、se ,: k = 2; break; default: p = malloc(sizeof(struct BTreeNode); p-data = ai; p-left = p-right = NULL; if(*bt = NULL) *bt = p; else if( 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;el

5、se return 0;/* 4.求二叉树深度 */int BTreeDepth(struct BTreeNode *bt)if(bt = NULL) return 0; /* 对于空树,返回0结束递归 */else int dep1 = BTreeDepth(bt-left); /* 计算左子树的深度 */ int dep2 = BTreeDepth(bt-right); /* 计算右子树的深度 */ if(dep1 dep2) return dep1 + 1; else return dep2 + 1; /* 5.从二叉树中查找值为x的结点,若存在则返回元素存储位置,否则返回空值 */el

6、emType *findBTree(struct BTreeNode *bt, elemType x)if(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

7、)/* 树为空时结束递归,否则执行如下操作 */if(bt != NULL) 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(struct BTreeNode* *bt)if(*bt != NULL) clearBTre

8、e(&(*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); /* 前序遍历左子树 */ preOrder(bt-right); /* 前序遍历右子树 */return;/* 9.前序遍历 */void inOrder(struct BTreeNode *bt)if(bt != NULL)

9、 inOrder(bt-left); /* 中序遍历左子树 */ printf(%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.按层遍历 */void lev

10、elOrder(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; printf(%c , p-data

11、); /* 若结点存在左孩子,则左孩子结点指针进队 */ if(p-left != NULL) rear = (rear + 1) % QUEUE_MAX_SIZE; qrear = p-left; /* 若结点存在右孩子,则右孩子结点指针进队 */ if(p-right != NULL) rear = (rear + 1) % QUEUE_MAX_SIZE; qrear = p-right; return;/*/*int main(int argc, char *argv)struct BTreeNode *bt; /* 指向二叉树根结点的指针 */char *b; /* 用于存入二叉树广义

12、表的字符串 */elemType x, *px;initBTree(&bt);printf(输入二叉树广义表的字符串:n);/* scanf(%s, b); */b = a(b(c), d(e(f, g), h(, i);createBTree(&bt, b);if(bt != NULL)printf( %c , bt-data);printf(以广义表的形式输出:n);printBTree(bt); /* 以广义表的形式输出二叉树 */printf(n);printf(前序:); /* 前序遍历 */preOrder(bt);printf(n);printf(中序:); /* 中序遍历 */

13、inOrder(bt);printf(n);printf(后序:); /* 后序遍历 */postOrder(bt);printf(n);printf(按层:); /* 按层遍历 */levelOrder(bt);printf(n);/* 从二叉树中查找一个元素结点 */printf(输入一个待查找的字符:n);scanf( %c, &x); /* 格式串中的空格跳过空白字符 */px = findBTree(bt, x);if(px) printf(查找成功:%cn, *px);else printf(查找失败!n);printf(二叉树的深度为:);printf(%dn, BTreeDep

14、th(bt);clearBTree(&bt);return 0;*/数据结构C语言实现系列7二叉树2#include #define QUEUE_MAX_SIZE 20#define STACK_MAX_SIZE 10typedef int elemType;#include BT.c/*/* 以下是关于二叉搜索树操作的4个简单算法*/*/* 1.查找 */* 递归算法 */elemType *findBSTree1(struct BTreeNode *bst, elemType x)/* 树为空则返回NULL */if (bst = NULL)return NULL; elseif (x =

15、 bst-data)return &(bst-data); elseif (x data)/* 向左子树查找并直接返回 */return findBSTree1(bst-left, x); else/* 向右子树查找并直接返回 */return findBSTree1(bst-right, x); /* 非递归算法 */elemType *findBSTree2(struct BTreeNode *bst, elemType x)while (bst != NULL)if (x = bst-data)return &(bst-data); else if (x data) bst = bst-

16、left; else bst = bst-right; return NULL;/* 2.插入 */* 递归算法 */void insertBSTree1(struct BTreeNode* *bst, elemType x)/* 新建一个根结点 */if (*bst = NULL)struct BTreeNode *p = (struct BTreeNode *)malloc(sizeof(struct BTreeNode); p-data = x; p-left = p-right = NULL;*bst = p;return; else if (x data)/* 向左子树完成插入运算

17、*/ insertBSTree1(&(*bst)-left), x); else/* 向右子树完成插入运算 */ insertBSTree1(&(*bst)-right), x); /* 非递归算法 */void insertBSTree2(struct BTreeNode* *bst, elemType x)struct BTreeNode *p;struct BTreeNode *t = *bst, *parent = NULL;/* 为待插入的元素查找插入位置 */while (t != NULL) parent = t;if (x data) t = t-left; else t =

18、t-right; /* 建立值为x,左右指针域为空的新结点 */ p = (struct BTreeNode *)malloc(sizeof(struct BTreeNode); p-data = x; p-left = p-right = NULL;/* 将新结点链接到指针为空的位置 */if (parent = NULL)*bst = p;/* 作为根结点插入 */ else if (x data)/* 链接到左指针域 */ parent-left = p; else parent-right = p; return;/* 3.建立 */void createBSTree(struct B

19、TreeNode* *bst, elemType a, int n)int i;*bst = NULL;for (i = 0; i n; i+) insertBSTree1(bst, ai); return;/* 4.删除值为x的结点,成功返回1,失败返回0 */int deleteBSTree(struct BTreeNode* *bst, elemType x)struct BTreeNode *temp = *bst;if (*bst = NULL)return 0; if (x data)return deleteBSTree(&(*bst)-left), x);/* 向左子树递归 *

20、/ if (x (*bst)-data)return deleteBSTree(&(*bst)-right), x);/* 向右子树递归 */ /* 待删除的元素等于树根结点值且左子树为空,将右子树作为整个树并返回1 */if (*bst)-left = NULL)*bst = (*bst)-right; free(temp);return 1; /* 待删除的元素等于树根结点值且右子树为空,将左子树作为整个树并返回1 */if (*bst)-right = NULL)*bst = (*bst)-left; free(temp);return 1; else/* 中序前驱结点为空时,把左孩子结

21、点值赋给树根结点,然后从左子树中删除根结点 */if (*bst)-left-right = NULL) (*bst)-data = (*bst)-left-data;return deleteBSTree(&(*bst)-left), (*bst)-data); else/* 定位到中序前驱结点,把该结点值赋给树根结点,然后从以中序前驱结点为根的 树上删除根结点*/struct BTreeNode *p1 = *bst, *p2 = p1-left;while (p2-right != NULL) p1 = p2; p2 = p2-right; (*bst)-data = p2-data;r

22、eturn deleteBSTree(&(p1-right), p2-data); /*/int main(int argc, char *argv)int x, *px; elemType a10 = 30, 50, 20, 40, 25, 70, 54, 23, 80, 92;struct BTreeNode *bst = NULL; createBSTree(&bst, a, 10); printf(建立的二叉搜索树的广义表形式为: ); printBTree(bst); printf( ); printf(中序遍历: ); inOrder(bst); printf( ); printf(输入待查找元素的值:); scanf( %d, &x);if (px = findBSTree1(bst, x) printf(查找成功!得到的x为:%d , *px); else printf(查找失败! ); printf(输入待插入的元素值:); scanf( %d,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1