数据结构复习指导6.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
树和二叉树 基础知识和算法 树及有关概念 树,根,子树;结点,结点的度,叶子(终端结点),分支结点(非终端结点),内部结点,树的度;孩子,双亲,兄弟,祖先,子孙,堂兄弟;层次(根所在层为第1层),深度,高度;有序树,无序树,二叉树是有序树;森林。 二叉树 二叉树(二叉树与度为2的树不同,二叉树的度可能是0,1,2);左孩子,右孩子。 二叉树的五种基本形态。 二叉树的性质 二叉树的第i层上至多有2i-1个结点。 深度为k的二叉树至多有2k-1个结点。 满二叉树:深度为k,有2k-1个结点。 完全二叉树:给满二叉树的结点编号,从上至下,从左至右,n个结点的完全二叉树中结点在对应满二叉树中的编号正好是从1到n。 叶子结点n0,度为2的结点为n2,则n0 = n2+1。 考虑结点个数:n = n0 + n1 + n2 考虑分支个数:n-1 = 2n2 + n1 可得n0 = n2+1 例:1) 二叉树有n个叶子,没有度为1的结点,共有 个结点。 2) 完全二叉树的第3层有2个叶子,则共有 个结点。 分析:1) 度为2的结点有n-1个,所以共2n-1个结点。 2) 注意考虑到符合条件的二叉树的深度可能是3或4,所以有5、10或11个结点。 n个结点的完全二叉树深度为。 n个结点的完全二叉树,结点按层次编号 有: i的双亲是,如果i = 1时为根(无双亲); i的左孩子是2i,如果2in,则无左孩子; i的右孩子是2i + 1,如果2i + 1n则无右孩子。 二叉树的存储结构 顺序存储结构 用数组、编号i的结点存放在[i-1]处。适合于存储完全二叉树。 链式存储结构 二叉链表: typedef struct BTNode { ElemType data; struct BTNode *lchild, *rchild; } BTNode, *BinTree; 三叉链表: typedef struct BTNode { ElemType data; struct BTNode *lchild, *rchild, *parent; } BTNode, *BinTree; 例:用二叉链表存储n个结点的二叉树(n0),共有(n+1)个空指针域;采用三叉链表存储,共有(n+2)个空指针域。 二叉树的五种基本形态 ①空树:bt==NULL ②左右子树均空:bt-lchild==NULL and bt-rchild==NULL ③右子树为空:bt-rchild==NULL ④左子树为空:bt-lchild==NULL ⑤左右子树均非空。 前两种常作为递归结束条件,后三者常需要递归。 遍历二叉树 常见有四种遍历方式 按层次遍历,先序遍历,中序遍历,后序遍历。 按层次遍历:“从上至下,从左至右”,利用队列。 先序遍历:DLR;中序遍历:LDR;后序遍历LRD。 例:写出a+b*(c-d)-e/f的前缀、中缀和后缀表达式。 画出二叉树,分别进行前序、中序、后序遍历即可得到。 前缀表达式:- + a * b - c d / e f 中缀表达式:a + b * c - d - e / f 后缀表达式:a b c d - * + e f / - 先序遍历算法 void Preorder ( BinTree bt ) { if ( bt ) { visit ( bt-data ); Preorder ( bt-lchild ); Preorder ( bt-rchild ); } } 中序遍历算法 void Inorder ( BinTree bt ) { if ( bt ) { Inorder ( bt-lchild ); visit ( bt-data ); Inorder ( bt-rchild ); } } 后序遍历 void Postorder ( BinTree bt ) { if ( bt ) { Postorder ( bt-lchild ); Postorder ( bt-rchild ); visit ( bt-data ); } } 非递归遍历二叉树 一般借助栈实现。设想一指针沿二叉树中序顺序移动,每当向上层移动时就要出栈。 (a) 中序非递归遍历 指针p从根开始,首先沿着左子树向下移动,同时入栈保存;当到达空子树后需要退栈访问结点,然后移动到右子树上去。 void InOrder ( BinTree bt, VisitFunc visit ) { InitStack ( S ); p = bt; while ( p || ! StackEmpty(S) ) { if

文档评论(0)

yan666888 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档