三维数据结构
完全二叉树的存储结构
一般二叉树的顺序存储 ① 将一般二叉树添上一些 "虚结点",成为"完全二 叉树" ② 为了用结点在向量中的相对位置来表示结点之间 的逻辑关系,按完全二叉树形式给结点编号 ③ 将结点按编号存入向量对应分量,其中"虚结点" 用"∮"表示
优点和缺点 ① 对完全二叉树而言,顺序存储结构既简单 又节省存储空间。 ② 一般的二叉树采用顺序存储结构时,虽然 简单,但易造成存储空间的浪费。 最坏的情况下,一个深度为k且只有k个结点的 右单支树需要2k-1个结点的存储空间。 ③在对顺序存储的二叉树做插入和删除结点操 作时,要大量移动结点。
四、三维GIS数据模型和数据结构 在计算机三维实体造型系统中,常用的形体表示技 术与方法有: (一)单元分解法:即三维GIS的栅格结构。 它以固定形状(如立方体)的单元体规则地分布于空 间网格位置上。一个形体就是这些具有邻接关系的 大量固定单元的集合,单元大小决定了单元分解形 式的精度。 它具有易于存取给定点的优点,能保证空间的 唯一性。缺点是各部分关系不够明确,需要耗费大 量的存储空间。在实际应用中一般采用八叉树(单 元正则形体)或BSP树(单元大小可变形体)的组织形 式。
刚体运动: 三维空间中,把一个几何物体作旋转,平移,及镜像对称 的运动,称之为刚体变换。 刚体运动也可以理解为保持长度,角度,面积等不变的仿 射变换,即保持内积和度量不变。 正则化把非适定问题转化为适定问题的过程。(一个问题 的解是存在的,惟一的和稳定的)
(三)边界表示法:即三维G1S的矢量结构, 一个形体用其拓扑边界表示。它记录形体的几 何元素的几何信息(顶点、边、面、体)以及相 互连接关系(拓扑信息),以便直接存取形体的 各个体与面、面的边界线,以及各个顶点。这 样有利于几实现以体、面、线、点为基础的各 种几何运算和操作,以及查询形体的拓扑信息, 例如实体中有哪几个相连通的部分等等。
一般来说,体域是目标实体的基本构成;认为任何 复杂的实体都是由体域(自然的或人工的)构成的; 体、面、线、点是一个动态的概念,在不同的比例 尺或不同的研究重点时可以相互转换。例如对整个 矿井来讲,巷道可认为是线域,而对某个工作面来 讲,巷道则是体域。按上述思路和观点,考虑保持 拓扑信息的完整性、易扩展性,提出用以下6组关系 来描述矿山GIS三维矢量结构的空间拓扑关系。
完全二叉树的顺序存储 将完全二叉树中所有结点按编号顺序依次存储 在一个向量bt[0..n]中。 其中:bt[1..n]用来存储结点 bt[0]不用或用来存储结点数目。 【例】下表是前述图形所示的完全二叉树的顺序 存储结构,bt[0]为结点数目,b[7]的双亲、左右孩 子分别是bt[3]、bt[l4]和bt[15]。
(1) 复杂地物—体关系:复杂地物与组成它的体域。 在该拓扑关系中加入对复杂地物属性的描述或指向 属性记录文件的指针。
(2) 体—复杂地物—曲面关系:体域与由其所构成 的复杂地物,体域与包围该体域的曲面,以及与该 体域相邻的体域。体拓扑结构中可加入对体域属性 的描述。
完全二叉树结点编号 (1) 编号办法 在一棵n个结点的完全二叉树中,从树根起, 自上层到下层,每层从左至右,给所有结点编号, 能得到一个反映整个二叉树结构的线性序列。
(2) 编号特点 完全二叉树中除最下面一层外,各层都充满了结点。每 一层的结点个数恰好是上一层结点个数的2倍。从一个结点的 编号就可推得其双亲,左、右孩子,兄弟等结点的编号。假设 编号为i的结点是ki(1≤i≤n),则有: ①若i>1,则ki的双亲编号为 ;若i=1,则Ki是根结 点,无双亲。 ②若2i≤n,则Ki的左孩子的编号是2i;否则,Ki无左孩子,即 Ki必定是叶子。因此完全二叉树中编号 的结点必定 是叶结点。 ③若2i+1≤n,则Ki的右孩子的编号是2i+1;否则,Ki无右孩子。 ④若i为奇数且不为1,则Ki的左兄弟的编号是i-1;否则,Ki无 左兄弟。 ⑤若i为偶数且小于n,则Ki的右兄弟的编号是i+1;否则,Ki无 右兄弟。
二叉树存储结构:顺序存储结构和链式存储结构。
1)二叉树的顺序存储结构 二叉树的顺序存储结构由一个一维数组构成,二 叉树上的结点按某种次序分别存入该数组的各个单元。 关键在于结点的存储次序,这种次序应能反映结点之 间的逻辑关系(父子关系),否则二叉树的基本运算 就难以实现。 该方法是把二叉树的所有结点按照一定的线性次序 存储到一片连续的存储单元中。结点在这个序列中 的相互位置还能反映出结点之间的逻辑关系。
1.八叉树:(octree)是一种用于描述三位空间的树 状数据结构。八叉树的每个节点表示一个正方体的 体积元素,每个节点有八个子节点,将八个子节点 所表示的体积元素加在一起就等于父节点的体积。
八叉树的逻辑结构如下: 假设要表示的形体V可以放在一个充分大的正方体C内,C的边 长为2 n,形体V C,它的八叉树可以用以下的递归方法来定 义: 八叉树的每个节点与C的一个子立方体对应,树根与C本身 相对应,如果V=C,那么V的八叉树仅有树根,如果V≠C,则 将C等分为八个子立方体,每个子立方体与树根的一个子节点 相对应。只要某个子立方体不是完全空白或完全为V所占据, 就要被八等分,从而对应的节点也就有了八个子节点。这样的 递归判断、分割一直要进行到节点所对应的立方体或是完全空 白,或是完全为V占据,或是其大小已是预先定义的体素大小, 并且对它与V之交作一定的“舍入”,使体素或认为是空白的, 或认为是V占据的。
带双亲指针的二叉链表 经常要在二叉树中寻找某结点的双亲时,可在每个结 点上再加一个指向其双亲的指针parent,形成一个带双亲 指针的二叉链表。 【例】下面右图是左图所示的二叉树的带双亲指针的二叉 链表。
注意:二叉树存储方法的选择,主要依赖于所要实施的各种运算的频度
(二)构造性表示法 (Constructive Solid Geometry) 它是通过体素(如正方体、球体、三角体等) 定义运算而得到新的形体的一种表示方法。 最著名的构造性表示法是构造实体几何(CSG) 法。CSG的体素本身是实体,其运算为刚体运 动或正则化的集合运算—并、交、差。该法 比较适用于机械、建筑等领域。
二叉树的五种基本形态 二叉树可以是空集;根可以有空的左子树或右子树; 或者左、右子树皆为空。 二叉树的五种基本形态如下图所示。
满二叉树、完全二叉树和不完全二叉树 满二叉树(FullBinaryTree) 一棵深度为k且有2k-1个结点的二又树称为满二叉树。 特点:(1)每一层上的结点数都达到最大值。即对给定的 高度,它是具有最多结点数的二叉树。(2)满二叉树中不存 在度数为1的结点,每个分支结点均有两棵高度相同的子树, 且树叶都在最下一层上。 完全二叉树(Complete BinaryTree) 若一棵二叉树至多只有最下面的两层上结点的度数可以小 于2,并且最下一层上的结点都集中在该层最左边的若干位置 上,则此二叉树称为完全二叉树。 特点:(1)满二叉树是完全二叉树,完全二叉树不一定是 满二叉树。(2)在满二叉树的最下一层上,从最右边开始连 续删去若干结点后得到的二叉树仍然是一棵完全二叉树。(3) 在完全二叉树中,若某个结点没有左孩子,则它一定没有右孩 子,即该结点必是叶结点。 非完全二叉树(Non-Complete BinaryTree)
八叉树的存贮结构 常规八叉树 线性八叉树 一对八的八叉树
1)规则八叉树 规则八叉树的存贮结构用一个有九个字段的记录来表示树 中的每个结点。其中一个字段用来描述该结点的特性(在目前 假定下,只要描述它是灰、白、黑三类结点中哪一类即可), 其余的八个字段用来作为存放指向其八个子结点的指针。这是 最普遍使用的表示树形数据的存贮结构方式。 规则八叉树缺陷较多,最大的问题是指针占用了大量的空 间。假定每个指针要用两个字节表示,而结点的描述用一个字 节,那么存放指针要占总的存贮量的94%。因此,这种方法虽 然十分自然,容易掌握,但在存贮空间的使用率方面不很理想。
【例】下面左图所示二叉树的二叉链表如下面中图所示。
注意:① 一个二叉链表由根指针root惟一确定。若二叉树为空,则 root=NULL;若结点的某个孩子不存在,则相应的指针为空。 ② 具有n个结点的二叉链表中,共有2n个指针域。其中只有n-1个用来指 示结点的左、右孩子,其余的n+1个指针域为空。
节点: 灰节点:它对应的立方体部分地为V所占据; 白节点:它所对应的立方体中无V的内容; 黑节点:它所对应的立方体全为V所占据。 白节点和黑节点又称为叶结点。形体V关于C的八叉 树的逻辑结构是一颗树,其上的节点要么是叶节点, 要么就是有八个子节点的灰节点。根节点与C相对应, 其它节点与C的某个子立方体相对应。
三维GIS矢量数据结构的拓扑关系:
拓扑关系的建立使得各种空间的操作与信息查 询易于实现。然而三维GIS中的三维拓扑关系建立 是一个棘手的问题,因为所研究目标的结构极其复 杂和不规则。从侧重于矿山实际应用的三维GIS研 究出发,认为,复杂地物可用充满空间的各种体域、 组成体域的曲面、构成曲面的边界环、组成环的弧、 弧上的结点来描述。
2)二叉树的链式存储结构
结点的结构 二叉树的每个结点最多有两个孩子。用链接方式存储二 叉树时,每个结点除了存储结点本身的数据外,还应设置两 个指针域lchild和rchild,分别指向该结点的左孩子和右孩 子。
二叉链表(二叉树的常用链式存储结构) 在一棵二叉树中,所有类型为BinTNode的结点,再加上 一个指向开始结点(即根结点)的BinTree型头指针(即根指 针)root,就构成了二叉树ห้องสมุดไป่ตู้链式存储结构,并将其称为二 叉链表
3)一对八式的八叉树 一个非叶结点有八个子结点,为了确定起见,将它们分别 标记为0,1,2,3,4,5,6,7。从上面的介绍可以看到, 如果一个记录与一个结点相对应,那么在这个记录中描述的 是这个结点的八个子结点的特性值。而指针给出的则是该八 个子结点所对应记录的存放处,而且还隐含地假定了这些子 结点记录存放的次序。也就是说,即使某个记录是不必要的 (例如,该结点已是叶结点),那么相应的存贮位置也必须空 闲在那里,以保证不会错误地存取到其它同辈结点的记录。 这样当然会有一定的浪费,除非它是完全的八叉树,即所有 的叶结点均在同一层次出现,而在该层次之上的所有层中的 结点均为非叶结点。