- 1、本文档共56页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 左指针域:用于指向该结点的左子结点的存储地址 右指针域:指向右子结点。 * 左指针域:用于指向该结点的左子结点的存储地址 右指针域:指向右子结点。 * 左指针域:用于指向该结点的左子结点的存储地址 右指针域:指向右子结点。 * 左指针域:用于指向该结点的左子结点的存储地址 右指针域:指向右子结点。 * * * * * * 二叉树的顺序存储 按二叉树的结点“自上而下、从左至右”编号,用一组连续的存储单元存储。 问:顺序存储后能否复原成唯一对应的二叉树形状? 答:若是完全/满二叉树则可以做到唯一复原。 而且有规律:下标值为i的双亲,其左孩子的下标值必为2i,其右孩子的下标值必为2i+1(即性质5) 例如,对应[2]的两个孩子必为[4]和[5],即B的左孩子必是D,右孩子必为E。 31 05 17 23 12 0 1 3 2 4 5 6 17 05 12 23 31 6 5 4 3 2 1 0 二叉树的顺序存储 讨论:不是完全二叉树怎么办? 答:一律转为完全二叉树! 方法很简单,将各层空缺处统统补上“虚结点”,其内容为空。 a c b 0 1 3 2 4 5 6 图示二叉树尽管只有三个结点,也要存储到一个长度为7的数组中,浪费存储空间。而且删除、插入操作极为不便。 6 5 4 3 2 1 0 c b a a c b 如果存储结点数为30的单支树,需要一个多大的一维数组?(同学们自算) a c b G … 答:利用性质2,补齐空缺结点后,算出共有230-1个结点。存储一个30个结点的单支树,要用长度为230-1的数组(1G),微型机根本不支持。存储空间的浪费异常明显。 二叉树的顺序存储 二叉树的顺序存储 怎样来解决这个问题? 不给空缺的结点留位置。按照从上到下,从左到右的顺序将二叉树的结点存储到一维数组中。(30个结点的单支树只需存储到一个长度为30的数组中)避免了存储空间的浪费,但这样做行不行呢? 答:不行。 二叉树的链式存储结构 二叉树通常采用链式存储结构。数据元素的存储结点由两部分组成:数据域和指针域。指针域存储指向左右孩子的指针,数据域存储结点本身的信息。 一般从根结点开始存储。(相应地,访问树中结点时也只能从根开始)。如果需要倒查某结点的双亲,可以再增加一个双亲域(直接前趋)指针,将二叉链表变成三叉链表。 二叉链表 二叉树a的链式存储结构如下图所示: 因每个结点中包含两个指针,所以这种形式的链式存储结构又被称为二叉链表。 在含有n个结点的二叉链表中,共有2n个指针域,但实际有效的指针数等于二叉树中的分支数(即n-1),所以共存在n+1个空的指针域。 二叉树的链式存储结构 二叉树结点数据类型定义: typedef int TElemType typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; } BITNODE, *PBITNODE; 构建二叉树 二叉树的构建过程如下:先创建某一子树的左子树,如果左子树不存在(输入负数时),则创建其右子树,如果左子树存在,再创建该树的左子树,依次循环。需要注意的是,当某一子树左子树不存在则判断其右子树,右子树不存在则返回其父节点再判断右子树。 特别要注意的是,一旦一个节点创建成功,则它的左子树和右子树都要判断,不论它们存不存在,因为此BiTree_Create调用,输入正整数,即节点创建成功后,都会去创建的left和right 构造二叉树 Status BiTree_Creat(BITNODE *T){ int elem;?? scanf(%c,elem);?? if(elem0) {????? T=NULL; return ERROR; } T =(BITNODE *)malloc(sizeof(BITNODE));??? if(T==NULL) return OVERFLOW;? ? T-data=elem;????BiTree_Creat (T-lchild);????BiTree_Creat (T-rchild);?? ??? return OK;} 构造二叉树 就上面的程序,依次输入1,2,-1,3,-1,-2,-3,也就是树的存储结构如下 树的构建过程如下: 输入1,创建主节点,接下来创建1的左子树, 输入2,主节点1的左子树创建成功,接下来创建2的左子树, 输入-1,节点2的左子树创建失败,返回执行等待的的函数(离当前最近的),创建节点2的右子树 输入3,节点2的
文档评论(0)