严蔚敏数据结构复习完整版.docx

  1. 1、本文档共55页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1.复杂性分析 对各种操作的时间复杂性的分析。 主要是链表,树,排序等简单一些的分析。 分析的时候,从简单的入手,学会方法。 后续的各种豆可能让你分析时间复杂度。 线性链表(顺序表和单链表) 链表 循环链表 双向链表 2.线性结构 队列(循环队列) 栈 链表主要操作: 找某一个元素, 插入一个(在哪个位置增加) ,删除一个(在哪个位置删除) 。栈:查找,插入(位置固定),删除(位置固定) 队列:查找,插入(位置固定),删除(位置固定) 顺序表(可以视为一个数组) 单链表: (删除) (插入) 倒置: (查找) 循环链表 双向链表 栈: (插入删除查找) 队列 (插入删除查找) 循环队列的实现,并不是像上面的图那样,实现了一个循环的样子。 3.二叉树 基本概念 二叉树是每个最多有两个子树的有序树。 二叉树常被用于实现和。 值得注意的是, 二叉树不是树的特殊情形 。 二叉树是每个结点最多有两个子树的有序树。通常根的子树被称作“左子树”( left subtree)和“右子树”( right subtree)。二叉树常被用作和或是。二叉树的每个结点至多只有二棵子树 (不存在出度大于 2 的结点 ),二叉树的子树有左右之分,次序不能颠倒。 二叉树不是树的一种特殊情形, 尽管其与树有许多相似之处, 但树和二叉树有两个主要差别: 1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为 2; 树的结点无左、右之分,而二叉树的结点有左、右之分。 二叉树是定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态: (1)空二叉树——如图 (a); (2)只有一个根结点的二叉树——如图 (b); (3)只有左子树——如图 (c) ; (4)只有右子树——如图 (d) ; (5)——如图 (e) 注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形 性质 (1) 在 非 空 二 叉 树 中 , 第 i 层 的 结 点 总 数 不 超 过 , i=1 ; 深度为 h 的二叉树最多有 2^h-1 个结点 (h=1) ,最少有 h 个结点; (3) 对于任意一棵二叉树,如果其叶结点数为 N0=N2+1 ;  N0,而度数为 2 的结点总数为  N2,则 具有 n 个结点的的深度为 (5)有 N 个结点的各结点如果用顺序方式存储,则结点之间有如下关系: 若 I 为结点编号则 如果 I1 ,则其父结点的编号为 I/2; 如果 2*I=N ,则其左儿子 (即左子树的根结点) 的编号为 2*I ;若 2*IN ,则无左儿子; 如果 2*I+1=N ,则其右儿子的结点编号为 2*I+1 ;若 2*I+1N ,则无右儿子。 (6)给定 N 个节点,能构成 h(N) 种不同的二叉树。 h(N) 为的第 N 项。h(n)=C(2*n ,n)/(n+1) 。 ( 7)设有 i 个枝点, I 为所有枝点的道路长度总和, J 为叶的道路长度总和 J=I+2i 存储结构 顺序存储表示 二叉树可以用或线性表来存储, 而且如果这是, 这种方法不会浪费空间。 用这种紧凑排列,如果一个结点的索引为 i,它的子结点能在索引 2i+1 和 2i+2 找到,并且它的父节点 (如果有)能在索引 floor((i-1)/2) 找到(假设根节点的索引为 0)。这种方法更有利于紧凑存储和更好的, 特别是在前序遍历中。然而, 它需要连续的, 这样在存储高度为 h 的 n 个结点组成的一般普通树时将会浪费很多空间。 一种最极坏的情况下如果深度为 h 的二叉树每个节点只有右孩子需要占用 2 的 h 次幂减 1,而实际却只有 h 个结点,空间的浪费太大,这是顺序存储结构的一大缺点。 /*  二叉树的顺序存储表示  */ #define MAX_TREE_SIZE 100 /*  二叉树的最大节点数  */ typedef TElemType SqBiTree[MAX_TREE_SIZE]; /* 0 号单元存储根节点 */ typedef struct { int level,order; /* 节点的层,本层序号 ( 按满二叉树计算 ) */ }position; 二叉链表存储表示 /* 二叉樹的二叉鏈表存儲表示 */ typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; /* 左右孩子指針 */ }BiTNode,*BiTree; 遍历算法 二叉树的遍历三种方式,如下: (1)前序遍历( DLR ),首先访问根结点,然后遍历左子树,最后遍历右子树。简记根 -左-右。 (2)中序遍历( LDR ),首先遍历左子树,然后访问根结点,最后遍历右子树。简记左 -根-右。 (3)后

文档评论(0)

137****0220 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档