Java数据结构-树及树的存储结构

树的定义:n(n>=0)个节点的有限集。

  1. n=0时称为空树。
  2. n!=0时为非空树,有且仅有一个特定的节点——根;n>1时,其它节点可以分为m(m>0)个互不相交的有限集T1~Tm,其中每一个集合本身又是一棵树,并且称为根的子树。

树的一些基本术语:

  1. 树的结点:由一个数据元素和若干个指向其子树的分支组成。
  2. 结点的度:结点所拥有的子树的个数(即分支数)称为该结点的度。
  3. 叶子结点:度为0的结点称为叶子结点,或者称为终端结点。
  4. 分支结点:度不为0的结点称为分支结点,或者称为非终端结点。一棵树的结点由叶子结点和分支结点组成。
  5. 孩子、双亲、兄弟:树中一个结点的子树的根结点称为这个结点的孩子;这个结点称为它孩子结点的双亲;具有同一个双亲的孩子结点互称为兄弟。
  6. 路径、路径长度:如果一棵树的一串结点n1,n2,…,nk有如下关系:结点ni是ni+1的父结点(i为1~k,不等于k的值),就把n1,n2,…,nk称为一条由n1至nk的路径。路径长度是指路径上经过的边的数量,所以这条路径的长度是k-1。
  7. 祖先、子孙:在树中,如果有一条路径从结点M到结点N,那么M就称为N的祖先,而N称为M的子孙。
  8. 结点的层数:规定树的根结点的层数为1,其余结点的层数等于它双亲结点的层数加1。
  9. 树的深度(高度):树中所有结点中的最大层数称为树的深度。
  10. 树的度:树中各结点中度的最大值称为该树的度。
  11. 有序树、无序树:如果一棵树中结点的各子树从左到右都是有次序的,不能交换的,称这棵树为有序树;反之为无序树。
  12. 森林:m(m>=0)棵互不相交的树的集合。
  13. 同构:对于两棵树,若通过对各结点适当重命名,就可以使这两棵树完全相等(结点对应相等,结点关系也相等),称这两棵树同构。
  14. 层序编号:将书中结点按照从上层到下层、同层从左到右的次序依次给它们编号1开始的自然数。

线性结构和树结构的比较:

树的存储结构:

双亲表示法:

(用一组连续空间来存储树的结点)

在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。

结点的结构如下:

下面演示一下双亲表示法:约定根结点的指针域设为-1;

这个方法通过结点只要花O(1)的时间就可以访问到此结点双亲结点,但是要找到其孩子结点却需要遍历整棵树。需要改进;

改进版一:增加最左孩子(长子)结点指针域;如下:

改进版二:增加右兄弟结点指针域;如下:

可以根据需求来进行改进,灵活的设计存储结构。

多重链表表示法:

(用多重链表来实现)

每个结点有多个指针,其中每个指针指向一棵子树的根结点,这种方法叫多重链表表示法。

方案一:

指针域的个数等于树的度;结构如下:

举例上图的树的度为3,所以指针域的个数为3,方法的实现如下:

解释:对于树中各结点的度相差很大时,是很浪费空间的;如果各结点的度相差很小时,空间是被充分利用的。

根据按需分配空间的想法,于是我们有了第二组方案。

方案二:

每个结点指针域的个数等于该结点的度,通过设置一个位置来存储结点指针域的个数;结构如下:

于是乎上述图可以画出该方案的实现:

解释:该方法客服了空间上的浪费,但是由于链表的结构不同以及需要维护结点的度的数值,因此在运算上就是在时间上有所消耗。

孩子表示法:

利用数组来存放数组的结点,利用单链表来存放结点的孩子结点。

演示上述图例结构如下:

解释:

表头数组的的结构;data是数据域,存储结点的数据信息;firstchild是头指针,存储该结点的孩子链表的头指针。

孩子链表的结构:child是数据域,存储某个结点在表头数组中的下标;next是指针域,用来存储指向某结点的下一个孩子结点的指针。

改进版:孩子双亲表示法:

在表头数组中增加一个parent域,用来保存指向双亲结点的指针。

孩子兄弟表示法:

结构如下:

解释:data是数据域;firstchild为指针域,存储该结点的长子的存储地址,rightsib是指针域,存储该结点的右兄弟结点的存储地址。

这样上述图中所述树的实现如下:

如果想找到双亲,可以增加一个双亲指针。

后续继续讲解二叉树。

版权声明:本文为博主原创文章,如需转载请注明出处并附上链接,谢谢。

时间: 2024-08-09 19:47:14

Java数据结构-树及树的存储结构的相关文章

数据结构--树(定义与存储结构)

树基本定义 树的定义 数是具有n个节点的有限集.如图即是一个树形结构. 节点分类 节点的度:一个节点拥有的子节点即成为节点的度,比如A节点,有B和C两个子节点,那么A节点的度=2. 叶节点(终端节点):没有子节点的节点,比如G.H.I.... 如图: 节点间关系 孩子节点:某一个节点的子节点称为孩子节点.比如B.C节点是A节点的孩子节点. 双亲节点:与孩子节点相反.比如,A节点是B.C的双亲节点. 兄弟节点:同一个双亲节点的孩子节点,之间称为兄弟节点.比如,B.C为兄弟节点. 如图: 树的存储结

数据结构--二叉树(定义与存储结构)

什么是二叉树 是具有n个节点的有限集合,由一个根节点和两棵互不相交二叉树组成.如图 从名字简单理解,就是具有2个树叉的树形结构,当然这不是绝对的,正如上图所示,我也可以只有一个树叉. 二叉树具有五种基本形态: (1)空二叉树 (2)只有一个根结点的二叉树 (3)只有左子树 (4)只有右子树 (5)既有左子树又有右子树 完全二叉树 这种二叉树,是二叉树中常用的专业术语,不是说一个完整的二叉树就是完全二叉树,这种二叉树叫满二叉树,如图 简单理解就像图片中,完全二叉树中每个节点的编号,都能映射到满二叉

1、数据结构的基本逻辑结构、存储结构和运算

数据结构的基本逻辑结构.存储结构和运算 1.基本逻辑结构 集合结构.线性结构.树形结构和图状结构 2.基本存储结构 线性存储:需要一块连续的内存地址空间,相关元素一次存储 链接存储:不需要连续的地址空间,每个节点包含元素和链接两个部分,元素存储数据值,链接存储下一个节点的地址 3.基本运算 ·创建运算 ·清除运算 ·插入运算 ·搜索运算(根据值返回位置) ·更新运算 ·访问运算(根据位置返回值) ·遍历运算 1.数据结构的基本逻辑结构.存储结构和运算,布布扣,bubuko.com

数据结构之树的基本运算和存储结构

树的运算: 寻找某节点 插入.删除某节点 遍历树中每个节点 先根遍历 后根遍历 层次遍历 树的存储结构: 1.双亲存储结构 typedef struct { ElemType data; int parent; }PTree[Maxsize]; 2.孩子链存储结构 typedef struct node { ElemType data; struct node *sons[MaxSons]; }TSonNode; 3.孩子兄弟链存储结构 typedef struct tnode { ElemTy

数据结构(十七)树的定义与存储结构

一.树的定义 1.树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点:(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1.T2....Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree). 2.结点分类:树的结点包含一个数据元素及若干指向其子树的分支.结点拥有的子树数称为结点的度(Degree).度为0的结点称为叶结点(Leaf)或终端结点:度不为0的结点称为非终端结点或分

数据结构所涉及的数据存储结构类型

大类分别为: 线性表,栈,队列,树,二叉树,图 线性表: 顺序存储结构的定义 typedef struct { ElemType data[maxsize];            //存放顺序表中的元素 int length;                       //存放顺序表的长度 }SqList;                     //顺序表的类型定义 链式存储结构的定义 typedef struct LNode             //定义单链表的节点类型 { Elem

数据结构--图的定义和存储结构

图的定义 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成.注意:在图结构中,不允许没有顶点,在定义中,如果V是顶点的集合,则强调了顶点集合V的有穷非空. 在图中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图. 图的存储结构 邻接矩阵 考虑到图是由顶点和边或者弧两部分组成的.合在一起比较困难,那就自然地考虑到分两个结构来分别存储.顶点不分大小.主次,所以用一个一位数组来存储是很不错的选择.而边或者弧是顶点与顶点之间的关系,一维搞不定,那就考虑用一个二维数组来存

Java数据结构系列之——树(2):二叉树的实现及其常用操作

package tree.binarytree; public class BiTreeNode { int data; BiTreeNode leftNode; BiTreeNode rightNode; public BiTreeNode(){ leftNode=null; rightNode=null; } public BiTreeNode(int data,BiTreeNode leftNode,BiTreeNode rightNode){ this.data=data; this.l

Java数据结构系列之——树(1):二叉树基本概念及特点小结

度的概念:结点拥有的子树数称为结点的度(degree).度为0的结点称为叶结点(leaf)或者终端结点.度不为0的结点称为非终端结点或者分支结点.除根节点以外,分支结点也称为内部结点.树的度是树内部结点的度的最大值. 树的深度或者高度:结点的层次从根开始定义起,根为第一层,根的孩子为第二层.树中结点的最大层次称为树的深度或者高度. 树的表示法:(1)双亲表示法(2)孩子表示法(3)孩子兄弟表示法 二叉树:二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi