《数据结构(C语言版)》第六章 二叉树的应用(jian )1.ppt

《数据结构(C语言版)》第六章 二叉树的应用(jian )1.ppt

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《数据结构(C语言版)》第六章 二叉树的应用(jian )1.ppt

第六章 二叉树的应用 6.1二叉搜索树(二叉排序树) 定义:二叉排序树或是一棵空树,或是具有下列性质的二叉树: 二叉排序树查找 查找过程: 若二叉排序树为空,则表明查找失败; 否则,若x等于当前树根结点的值,则表明查找成功,应返回该结点值域的地址; 若x小于根结点的值,则继续在根的左子树中查找; 若x大于根结点的值,则继续在根的右子树中查找。 显然这是一个递归查找过程。 算法描述。 ElemType* Find(struct BTreeNode* BST, ElemType x) { if(BST==NULL) return NULL; else { if(x==BST-data) return (BST-data); else if(xBST-data) return Find(BST-left,x); else return Find(BST-right,x); } } 此算法属于末尾递归的调用,因此原先保存在数据堆栈中的信息都是没有用处的,为节省空间,可编写相应的非递归算法: ElemType * Find1(struct BTreeNode* BST,ElemType x) { while(BST!=NULL) { if(x==BST-data) return (BST-data); else if(xBST-data) BST=BST-left; else BST=BST-right; } return NULL; } 二叉排序树插入 插入原则: 若二叉排序树为空,则插入结点应为新的根结点; 否则,若x小于根结点,则将新结点插入到根的左子树上,若x大于等于(若不允许具有相同值的结点存在,则对等于情况应作单独处理)根结点,则将新结点插入到根的右子树上,显然插入过程是递归的,对应的递归算法描述: 算法描述 void Insert(struct BTreeNode** BST, ElemType x) { if(*BST==NULL) { struct BTreeNode* p=malloc(sizeof(struct BTreeNode)); p-data=x; p-left=p-right=NULL; *BST=p; } else if(x(*BST)-data) Insert(((*BST)-left),x); else Insert(((*BST)-right),x); } 二叉排序树生成:从空树出发,经过一系列的查找、插入操作之后,可生成一棵二叉排序树 6.2堆(Heap) 定义 分为小根堆和大根堆两种,对于一个小根堆,它是具有如下特性的一棵完全二叉树。 若树根结点存在左孩子,则根结点的值(或某个域的值)小于等于左孩子结点的值(或某个域的值); 若树根结点存在右孩子,则根结点的值(或某个域的值)小于等于右孩子结点的值(或某个域的值); 以左、右孩子为根的子树又各是一个堆。 大根堆的定义与上述类似,只要把小于等于改为大于等于就可以了。 堆的存储结构 堆是一棵完全二叉树,所以适宜采用顺序存储结构,这样能够充分利用存储空间。 让堆中的结点从0开始编号后: 编号为0至[n/2]-1的结点为分支结点,编号为[n/2]至n-1的结点为叶子结点; 当n为奇数则每个分支结点既有左孩子又有右孩子,当n为偶数则每个分支结点只有左孩子没有右孩子; 对于每个编号为i的分支结点,其左孩子结点的编号为2i+1,右孩子结点的编号为2i+2; 除编号为0的堆顶结点外,对于其余编号为i的结点,其双亲结点的编号为 [(i-1)/2] 堆的顺序存储结构 堆的运算—向堆中插入一个元素 基本思想: 将新元素写入到堆尾,即堆中最后一个元素的后面,即下标为len的位置上, 调整为一个新堆。 调整方法: 若新元素小于双亲结点的值,就让它们互换位置,使得以该位置为根的子树成为堆; 新元素可能还小于此位置的双亲结点的值,从而使以上一层的双亲结点为根的子树不为堆,还需要按上述方法继续调整; 持续传递上去直到以新位置的双亲结点为根的子树仍为一个堆或者调整到堆顶为止,此时得到的整个树又成为了一个堆。 算法描述: void InsertHeap(struct HeapSq* HBT, ElemType x) { int i; if(HBT-len==HBT-MaxSize) {

文档评论(0)

资料 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档