欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

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

    • 资源ID:32488371       资源大小:69.21KB        全文页数:11页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    数据结构 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 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 处理左子树, k = 2 处理右子树 */ int i = 0; /* 用 i 扫描数组 a 中存储的二叉树广义表字符串,初值为0 */ *bt = NULL; /* 把树根指针置为空,即从空树开始建立二叉树 */ /* 每循环一次处理一个字符,直到扫描到字符串结束符0 为止 */ while(ai != 0) switch(ai) case : break; /* 对空格不作任何处理 */ case (: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 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 = 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; else return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - /* 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 的结点,若存在则返回元素存储位置,否则返回空值 */ 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 = findBTree(bt-left, x) return p; if(p = findBTree(bt-right, x) return p; return NULL; /* 6.输出二叉树 ( 前序遍历 ) */ void printBTree(struct BTreeNode *bt) /* 树为空时结束递归,否则执行如下操作 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 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(); 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); /* 前序遍历左子树 */ 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); /* 中序遍历右子树 */ 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_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_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 *bt; /* 指向二叉树根结点的指针 */ 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(前序: ); /* 前序遍历 */ 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) printf(查找成功: %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_MAX_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, 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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 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; elseif (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 data) 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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 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 BTreeNode* *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(temp); return 1; /* 待删除的元素等于树根结点值且右子树为空,将左子树作为整个树并返回1 */if (*bst)-right = NULL) *bst = (*bst)-left; free(temp); return 1; else /* 中序前驱结点为空时,把左孩子结点值赋给树根结点,然后从左子树中删除根结点*/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - 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; return 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, &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 页 - - - - - - - - -

    注意事项

    本文(2022年数据结构C语言实现系列[]二叉树 .pdf)为本站会员(H****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

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

    收起
    展开