《数据结构》讲义课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《数据结构》讲义课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 讲义 课件
- 资源描述:
-
1、p树、二叉树的定义、性质和存储结构;p二叉树的遍历和线索化以及遍历算法的各种描述形式;p树遍历;p二叉树的多种应用。p熟练掌握二叉树的结构特性;p熟悉二叉树的各种存储结构的特点及适用范围;p熟练掌握二叉树各种遍历策略的递归和非递归算法,了解遍历过程中“栈”的作用和状态,而且能灵活运用遍历算法实现二叉树的其它操作;p理解二叉树线索化的实质是建立结点与其在相应序列中的前驱或后继之间的直接联系;p熟悉树的各种存储结构及其特点;p学会编写实现树的各种操作的算法;p了解最优树的特性,掌握建立最优树和哈夫曼编码的方法。p树是一类重要的非线性数据结构,是以分支关系定义的层次结构;p树是n(n0)个结点的有限
2、集,非空树满足:n有且仅有一个特定的称之为有且仅有一个特定的称之为(root)的结点;的结点;n除根以外的其余结点可分为除根以外的其余结点可分为m(0 mn)个互不相交的个互不相交的子集子集T1,T2,T3Tm,其中每个子集本身又是一棵树,其中每个子集本身又是一棵树,且且称为根的称为根的。p特点:除根结点外,每个结点都仅有一个前趋(父)结点。p其它表示方法:n嵌套集合表示法嵌套集合表示法n凹入表表示法凹入表表示法参见教材参见教材120页页AB C DE F G H IJ1层2层3层4层p结点的度(结点的度(degree)n结点所拥有的子树的数目。结点所拥有的子树的数目。p叶子结点(叶子结点(l
3、eaf-又称终端结点又称终端结点 terminal node)n度为零的结点。度为零的结点。p分支结点(分支结点(branch node)n度不为零的结点度不为零的结点p孩子(孩子(child)n结点的子树的根称为结点的孩子。结点的子树的根称为结点的孩子。p双亲(双亲(parent)n结点是其孩子的双亲。结点是其孩子的双亲。p祖先(祖先(forefather)n从树根到双亲的所有结点称为该结点的祖先。从树根到双亲的所有结点称为该结点的祖先。p子孙(子孙(progeny)n以结点为根的子树的所有结点称为该结点的子孙。以结点为根的子树的所有结点称为该结点的子孙。p兄弟(兄弟(sibling)n同一
4、父母的所有孩子互称兄弟。同一父母的所有孩子互称兄弟。p层次(层次(level)n树根为第一层,其孩子为第二层,孙子为第三层,以树根为第一层,其孩子为第二层,孙子为第三层,以此类推。此类推。p堂兄弟(堂兄弟(cousin)n双亲在同一层的结点互称堂兄弟。双亲在同一层的结点互称堂兄弟。p深度(深度(depth)n树中结点的最大层次称为树的深度。树中结点的最大层次称为树的深度。p有序树(有序树(ordered tree)n结点各子树从左至右是有秩序的树称为有序树。结点各子树从左至右是有秩序的树称为有序树。p无序树(无序树(unordered tree)n结点各子树没有秩序的树称为无序树。结点各子树没
5、有秩序的树称为无序树。p森林(森林(forest)n森林是森林是 m(m0)棵互不相交的树的集合。棵互不相交的树的集合。p初始化操作InitTree(&T)p求根函数 Root(T)p求双亲函数 Parent(T,cur_e)p求左孩子结点函数LeftChild(T,cur_e)p建树函数CreateTree(&T,definiton)p清空树函数ClearTree(&T)p插入子树函数InsertChild(&T,&p,i,c)p删除子树函数DeleteChild(&T,&p,i)p遍历函数TraverseTree(T,visit()p求右兄弟函数RightSibling(T,cur_e)p
6、定义n二叉树是二叉树是n(n 0)个结点的有限集合,它或为空个结点的有限集合,它或为空树树(n=0),或由一个根结点和两棵互不相交的左,或由一个根结点和两棵互不相交的左子树和右子树的二叉树组成。子树和右子树的二叉树组成。p二叉树的特点:n定义是递归的;定义是递归的;n0 结点的度结点的度 2;n是有序树。是有序树。p二叉树的五种基本形态p两种特殊的二叉树n满二叉树:每一层上的结点数都是最大结点数。满二叉树:每一层上的结点数都是最大结点数。n完全二叉树:只有最下面两层结点的度可小于完全二叉树:只有最下面两层结点的度可小于2,而最,而最下一层的叶结点集中在左边若干位置上。下一层的叶结点集中在左边若
7、干位置上。12 34 5 6 712 34 5 6 78 9 10p性质1n二叉树的第二叉树的第i层上至多有层上至多有2i-1(i 1)个结点。个结点。p性质2n深度为深度为k的二叉树至多有的二叉树至多有2k-1个结点个结点(k 1)。p性质3n对任何一棵二叉树对任何一棵二叉树T,如果其终端结点数为,如果其终端结点数为n0,度为,度为2的的结点数为结点数为n2,则,则n0=n2+1。p性质4n具有具有n个结点的完全二叉树的深度为个结点的完全二叉树的深度为 log2n+1。p性质5n对一棵具有对一棵具有n个结点的完全二叉树个结点的完全二叉树(其深度为其深度为 log2n+1),对其结点按层从上至
8、下对其结点按层从上至下(每层从左至右每层从左至右)进行进行0至至n-1的编的编号,则对任一结点号,则对任一结点i(0 i0,则i的双亲是(i-1)/2。p若2i+1n,则i有左孩子,左孩子是2i+1。p若2(i+1)lchild);Preorder(t-rchild);void Inorder(BiTree t)if (t)Inorder(t-lchild);visit(t);Inorder(t-rchild);void Postorder(BiTree t)if(t)Postorder(t-lchild);Postorder(t-rchild);visit(t);p利用遍历结果确定二叉树问题
9、n先序序列先序序列+中序序列中序序列n中序序列中序序列+后序序列后序序列n先序序列先序序列+后序序列后序序列(x)先序序列:ABCDEFGH 中序序列:BDCEAFHGABFCGDEH思考:层序+先序/中序/后序,能否确定?如何做?例如:层序ABCDEFGHIJ,中序DBGEHJACIF void get_post(char*pre,char*in,char*post,int n)if(n=0)return;for(k=0;k n;k+)if(ink=pre0)break;if(!k rchild);push(p-lchild);非递归算法,考虑取消多余的空指针入栈,空指针个数可观,为n+1个
10、init_stack();p=t;push(NULL);while(p)visit(p);if(p-rchild)push(p-rchild);if(p-lchild)p=p-lchild;else p=pop();init_stack();p=t;while(!stack_empty()|p)visit(p);if(p-rchild)push(p-rchild);if(p-lchild)p=p-lchild;else p=pop();p非递归算法 init_stack();push(root,0);while(!stack_empty()p=pop(&state);if(p=NULL)con
11、tinue;if(state=0)push(p,1);push(p-lchild,0);else if(state=1)push(p,2);push(p-rchild,0);else visit(p);p非递归算法 init_stack();push(root,0);while(!stack_empty()p=pop(&state);if(p=NULL)continue;if(state=0)push(p,2);push(p-rchild,0);push(p-lchild,0);else visit(p);p朴素的算法 init_stack();push(root,0);while(!stac
12、k_empty()p=pop(&state);if(p=NULL)continue;if(state=0)push(p,1);push(p-lchild,0);else if(state=1)visit(p);push(p-rchild,0);p效率问题效率问题 新压入堆栈的新压入堆栈的state0节点马上弹出然后再次压入作为节点马上弹出然后再次压入作为state1节点节点 init_stack();p=root;while(p)push(p);p=p-lchild;while(!stack_empty()p=pop();visit(p);p=p-rchild;while(p)push(p);
13、p=p-lchild;init_stack();p=root;while(p|!stack_empty()if(p)push(p);p=p-lchild;else p=pop();visit(p);p=p-rchild;p在二叉树中查找结点值为x的结点p求二叉树中每个结点所处的层次p求二叉树的高度p复制一棵二叉树A B C D E F G 0 01033 1 2 3 4 5 6ABCEFGD 存储方法:使用顺序结构存储方法:使用顺序结构#define MAX_TREE_SIZE 100typedef struct PTNode TElemType data;int parent;PTNode;
14、/*节点的存储结构节点的存储结构*/typedef struct/*顺序存储结构顺序存储结构*/PTNode nodesMAX_TREE_SIZE;int r,n;/*根位置和节点数根位置和节点数*/PTree;优点:简单,紧凑,易于寻找双亲节点优点:简单,紧凑,易于寻找双亲节点缺点:查询某节点的孩子效率低缺点:查询某节点的孩子效率低 方法一 struct PTNode TElemType data;struct PTNode*childNUM_CHILD;缺点:NUM_CHILD值不容易确定;空域数目太多方法二:改进方法1,记录节点的度,分配合适大小的内存方法三:使用链表勾链,链表的每个节点
15、记录一个孩子指针优缺点比较和其他存储方案 选用的实际存储结构该考虑到可能需要操作(增加,删除,检索)ABCEFGDABCDEFG1234650123456#define MAX_TREE_SIZE 100struct TNode TElemType data;int degree;int child1;struct PTree struct TNode*nodeMAX_TREE_SIZE;int n;PTree;struct TNode*create_tnode(void)struct TNode*p;int k,degree;scanf(“%d”,°ree);p=malloc(size
展开阅读全文