第5章树与二叉树题材.ppt

  1. 1、本文档共81页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
;;;;基本术语(概念) 父结点、子结点、边 若y为x的一颗子树的根,x为y的父结点 y为x的子结点, 有向对x, y为从x到y的边 兄弟:同一父母的结点互为兄弟 祖先、子孙 若y在x的一颗子树中(y≠x), x为y的祖先,y为x的子孙 路径、路径长度 从祖先x到子孙y的边的序列为x到y的路径, 边的数目为路径长度 结点的层、树的层数 根的层为0,其余结点的层为父结点层+1 树的层数:结点的最大层数【空树: 0, 其它:≥1】;树的深度和高度:结点的最大层数 【空树: 0, 其它: ≥1】 结点的度和树的度 结点的子树个数为结点的度, 最大结点的度为树的度 树叶和分支结点 度数为0的结点为树叶(终端结点), 其余结点为分支结点 无序树、有序树: 子树无次序的树为无向树,否则为有向树 结点的次序 在有向树中从左往右规定结点的次序, 以右结点为根的子树中所有结点 皆在左结点的右边。; 零颗或多颗互不相交的树构成树林(森林),树根互为兄弟。对树中每个结点而言,其子树的集合即为树林。 就逻辑结构而言,任何一棵树是一个二元组Tree=(root,F),其中root称为树的根结点;F是m(m=0)棵子树构成的树林,F=(T1, T2,…,Tm), 其中Ti=(ri,Fi)称作根root的第i棵子树;当m?0时,在树根和其子树林之间存在下列关系: RF={root, ri | i=1,2,…,m, m0};4. 树的基本运算;5.2 树和树林的存储表示;(1)父结点表示法 用一组连续空间存储树的结点,并附设一个指示器指示其双亲结点的位置。结构类型如下:;结点顺序存放,结点的位置由结点在数组中的下标给出。根结点无父结点,因此其parent为-1。 优点:a) 容易求根、找父结点及其所有的祖先; b) 能找到结点的子女和兄弟; 缺点:a) 没有表示出结点之间的左右次序 (无法求最左右兄弟); b) 找结点的子女和兄弟比较费事;;改进方法:按一种周游次序在数组中存放结点。 常见的一种方法是依次存放树的先根序列,如下图:;找长子运算:如果存在长子,必定在结点的下一个位置 if (t-nodelist[p+1].parent == p) return p+1; else return -1; 找右兄弟运算:与结点具有相同父结点的后面结点 parent = t-nodelist[p].parent; for (i = p+1; i t-n; i++) { if (t-nodelist[i].parent == parent) return i; } return –1;;(2)子表表示法;typedef struct ChiTree /* 树结构 */ { ChiTreeNode node_list[MAXNUM]; int root; /* 根结点的位置 */ int n; /* 结点的个数 */ } ChiTree, *PChiTree; ;找右兄弟:for (m=0; m t-n; m++) { v = t-nodelist[m].children; while (v) { if (v-node_position == p) { if (v-next) return v-next-node_position; else return –1; } v = v-next; } } 找双亲: for (m = 0; m t-n; m++) { v = t-nodelist[m].children; while(v) { if (v-nodeposition == p) return(m); v = v-next; } return –1; };(3)长子-兄弟表示法;优点:方便找子女、找兄弟等运算 缺点:找父结点麻烦 注意: 通过长子-

文档评论(0)

1112111 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档