2022年数据结构C语言实现系列[]二叉树 .pdf

上传人:H****o 文档编号:32488371 上传时间:2022-08-09 格式:PDF 页数:11 大小:69.21KB
返回 下载 相关 举报
2022年数据结构C语言实现系列[]二叉树 .pdf_第1页
第1页 / 共11页
2022年数据结构C语言实现系列[]二叉树 .pdf_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《2022年数据结构C语言实现系列[]二叉树 .pdf》由会员分享,可在线阅读,更多相关《2022年数据结构C语言实现系列[]二叉树 .pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、数据结构 C 语言实现系列7 二叉树 1 #include #include #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 initBTree(struct BTreeNod

2、e* *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 处理左子树, k = 2 处理右子

3、树 */ int i = 0; /* 用 i 扫描数组 a 中存储的二叉树广义表字符串,初值为0 */ *bt = NULL; /* 把树根指针置为空,即从空树开始建立二叉树 */ /* 每循环一次处理一个字符,直到扫描到字符串结束符0 为止 */ while(ai != 0) switch(ai) case : break; /* 对空格不作任何处理 */ case (: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - if

4、(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 = malloc(sizeof(struct BTreeNode); p-data = ai; p-left = p-right = NULL; if(*bt = NULL) *bt = p; else if( k = 1) stop

5、-left = p; else stop-right = p; i+; /* 为扫描下一个字符修改i 值 */ return; /* 3.检查二叉树是否为空,为空则返回1, 否则返回 0 */ int emptyBTree(struct BTreeNode *bt) if(bt = NULL) return 1; else return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - /* 4.求二叉树深度 */ int

6、 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 的结点,若存在则返回元素存储位置,否则返回空值 */ elemType *findBTree(struc

7、t 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) /* 树为空时结束递归,否则执

8、行如下操作 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 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()

9、; return; /* 7.清除二叉树,使之变为一棵空树 */ void clearBTree(struct 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); /* 前序遍历左子树 */

10、 preOrder(bt-right); /* 前序遍历右子树 */ return; /* 9.前序遍历 */ void inOrder(struct BTreeNode *bt) if(bt != NULL) inOrder(bt-left); /* 中序遍历左子树 */ printf(%c , bt-data); /* 访问根结点 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - inOrder(bt-right);

11、/* 中序遍历右子树 */ return; /* 10.后序遍历 */ void postOrder(struct BTreeNode *bt) if(bt != NULL) postOrder(bt-left); /* 后序遍历左子树 */ postOrder(bt-right); /* 后序遍历右子树 */ printf(%c , bt-data); /* 访问根结点 */ return; /* 11.按层遍历 */ void levelOrder(struct BTreeNode *bt) struct BTreeNode *p; struct BTreeNode *qQUEUE_MAX

12、_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); /* 若结点存在左孩子,则左孩子结点指针进队 */ if(p-left != NULL) rear = (rear + 1) % QUEUE

13、_MAX_SIZE; qrear = p-left; /* 若结点存在右孩子,则右孩子结点指针进队 */ if(p-right != NULL) rear = (rear + 1) % QUEUE_MAX_SIZE; qrear = p-right; return; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - /*/ /* int main(int argc, char *argv) struct BTreeNode *b

14、t; /* 指向二叉树根结点的指针 */ char *b; /* 用于存入二叉树广义表的字符串 */ 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(前序: );

15、/* 前序遍历 */ preOrder(bt); printf(n); printf(中序: ); /* 中序遍历 */ 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) pri

16、ntf(查找成功: %cn, *px); else printf(查找失败! n); printf(二叉树的深度为: ); printf(%dn, BTreeDepth(bt); clearBTree(&bt); return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - */ 数据结构 C 语言实现系列7 二叉树 2 #include #define QUEUE_MAX_SIZE 20 #define STACK_M

17、AX_SIZE 10 typedef int elemType; #include BT.c /*/* 以下是关于二叉搜索树操作的4 个简单算法 */*/* 1.查找*/* 递归算法*/elemType *findBSTree1( struct BTreeNode *bst, elemType x) /* 树为空则返回NULL */if (bst = NULL) return NULL; else if (x = bst-data) return &(bst-data); else if (x data) /* 向左子树查找并直接返回*/return findBSTree1(bst-left,

18、 x); else /* 向右子树查找并直接返回*/return findBSTree1(bst-right, x); /* 非递归算法*/elemType *findBSTree2( struct BTreeNode *bst, elemType x) while (bst != NULL) if (x = bst-data) return &(bst-data); elseif (x data) bst = bst-left; else bst = bst-right; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精

19、心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - 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; elsei

20、f (x data) /* 向左子树完成插入运算*/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 dat

21、a) t = t-left; else t = t-right; /* 建立值为x,左右指针域为空的新结点*/p = (struct BTreeNode *)malloc( sizeof(struct BTreeNode); p-data = x; p-left = p-right = NULL; /* 将新结点链接到指针为空的位置*/if (parent = NULL) *bst = p; /* 作为根结点插入*/ elseif (x data) /* 链接到左指针域*/parent-left = p; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -

22、 - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - else parent-right = p; return; /* 3.建立*/void createBSTree(struct BTreeNode* *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 BTreeNod

23、e* *bst, elemType x) struct BTreeNode *temp = *bst; if (*bst = NULL) return 0; if (x data) return deleteBSTree(&(*bst)-left), x); /* 向左子树递归*/ if (x (*bst)-data) return deleteBSTree(&(*bst)-right), x); /* 向右子树递归*/ /* 待删除的元素等于树根结点值且左子树为空,将右子树作为整个树并返回1 */if (*bst)-left = NULL) *bst = (*bst)-right; free

24、(temp); return 1; /* 待删除的元素等于树根结点值且右子树为空,将左子树作为整个树并返回1 */if (*bst)-right = NULL) *bst = (*bst)-left; free(temp); return 1; else /* 中序前驱结点为空时,把左孩子结点值赋给树根结点,然后从左子树中删除根结点*/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - if (*bst)-left-right =

25、 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; return deleteBSTree(&(p1-right), p2-data); /

26、*/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 = f

27、indBSTree1(bst, x) printf( 查找成功!得到的x 为: %d , *px); else printf( 查找失败!); printf( 输入待插入的元素值:); scanf( %d, &x); insertBSTree1(&bst, x); printf( 输入待删除元素值:); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - scanf( %d, &x); if (deleteBSTree(&bst, x) printf(1 ); else printf(0 ); printf( 进行相应操作后的中序遍历为:); inOrder(bst); printf( ); printf( 操作后的二叉搜索树的广义表的形式为:); printBTree(bst); printf( ); clearBTree(&bst); return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁