数据结构专升本资料第五周..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文档。上传文档
查看更多
数据结构专升本资料第五周.

二叉树的特殊形态 满二叉树(Full Binary Tree):一棵深度为k且有2k-1个结点的二叉树。 特点1:二叉树的所有分支结点都存在左子树和右子树 特点2:二叉树的所有叶子结点都在同一层上 完全二叉树(Complete Binary Tree):深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应。 特点1:叶子结点只可能在层次最大的两层上出现 特点2:对任一结点,若其右分支下的子孙的最大层次为L,则其左分支下的子孙的最大层次必为 L 或 L+1 性质4: 具有n个结点的完全二叉树的深度为「log2n」+1性质5: 如果对一棵有n个结点的完全二叉树(其深度为「log2n」+1)的结点按层序编号(从第1层到第「log2n」+1层,每层从左到右),则对任一结点i(1≤i≤n),有 如果 i=1,则结点i是二叉树的根,无双亲;如果 i>1,则其双亲PARENT(i)是结点「i/2」。 如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子LCHILD(i)是结点2i。 如果2i+1>n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点2i+1。顺序存储结构就是用一组连续的存储单元来存放二叉树的各结点信息。  顺序存储结构可以用一个一维数组来顺序存储二叉树中所有结点的数据信息,并通过数组元素的下标关系来反映完全二叉树中结点间的逻辑关系。一般的二叉树也必须按完全二叉树的形式来存储,这将造成存贮的浪费。在最坏的情况下,一个深度为k且只有k个结点的单支树(树中无度为2的结点)却需2k-1个存储分量。 链式存储结构二叉树的链式存储结构是用链来建立树中结点之间的关系,二叉树的这种链式存储结构我们通常称为二叉链表。 在含有n个结点的二叉链表中有n+1个空链域。 6.3遍历二叉树 遍历(Traversal):是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。 从二叉树的递归定义可知,二叉树是由三个基本单元组成:根结点、左子树和右子树。因此,若能依次遍历这三部分,便是遍历了整个二叉树。假如以L,D,R分别表示遍历左子树、访问根结点和遍历右子树,则可有DLR、LDR、LRD、DRL、RDL、RLD六种遍历二叉树的方案。若限定先左后右,则只有前三种情况,分别称之为前序遍历,中序遍历和后序遍历。 前序遍历   前序遍历(Preorder Traversal)亦称先序遍历,定义为: 若二叉树为空,则空操作;否则,执行下列步骤: (1)访问根结点 (2)遍历左子树 (3)遍历右子树 中序遍历   中序遍历(Inorder Traversal)定义为: 若二叉树为空,则空操作;否则,执行下列步骤: (1)遍历左子树 (2)访问根结点 (3)遍历右子树 后序遍历   后序遍历Postorder Traversal)定义为:   若二叉树为空,则空操作;否则,执行下列步骤:  (1)遍历左子树   (2)遍历右子树   (3)访问根结点 void Preorder(BinTree T) { if(T) { printf(%c,T-data); /*访问结点*/ Preorder(T-lchild); Preorder(T-rchild); } } /*中序遍历二叉树*/ void Inorder(BinTree T) { if(T) { Inorder(T-lchild); printf(%c,T-data); /*访问结点*/ Inorder(T-rchild); } } /*后序遍历二叉树*/ void Postorder(BinTree T) { if(T) { Postorder(T-lchild); Postorder(T-rchild); printf(%c,T-data); /*访问结点*/ } } 构造二叉链表   基于先序遍历构造二叉链表算法。  void CreateBinTree(BinTree *T) { char ch; if ((ch=getchar())== ) *T=NULL; else { /*读入非空格*/ *T=(BinTNode *)malloc(sizeof(BinTNode)); /*生成结点*/ (*T)-data=ch; CreateBinTree((*T)-lchild ); /*构造左子树*/ CreateBinTree((*T)-rchild ); /*构造右子树*/ } } 给定结点的前序、中序或后序、中序序列,可唯一的确定一棵二叉树 利用前序遍历、中序遍历构

文档评论(0)

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

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

1亿VIP精品文档

相关文档