经过数据结构(二)系列文章,已经把线性结构中最常用的数据结构进行了介绍,包括顺序存储结构中顺序表、顺序队列和顺序栈,链式存储结构中的链表、链栈和链队列。线性结构是数据结构中最为常见也最简单的逻辑结构。下面将进入非线性逻辑的数据结构部分,还记得下面的一副数据结构的分类图吧,对于非线性逻辑,主要介绍树和图。本文主要先针对树进行复习和总结,后续的博文将逐渐深入到图等更为复杂的非线性逻辑数据结构。
树是 n(n≥0)个结点的有限集T,其中有且仅有一个特定的结点,称为树的根(root)。当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree)。
树中至少有一个结点——根(root);
树中各子树是互不相交的集合。
结点(node)——表示树中的元素
结点的度(degree)——结点拥有的子树数
叶子(leaf)——度为0的结点
孩子(child)——结点子树的根称为该结点的孩子
双亲(parents)——孩子结点的上层结点叫该结点的~
兄弟(sibling)——同一双亲的孩子
树的度——一棵树中最大的结点度数
结点的层次(level) ——从根结点算起,根为第一层,它的孩子为第二层……
深度(depth)——树中结点的最大层次数
森林(forest) ——m(m>0)棵互不相交的树的集合
路径:根节点到某节点之间;两节点之间;路径是唯一的
路径的长度
结点的深度 (depth),高度(height)
树的深度,高度
结点的祖先
结点后代
有向树:(1) 有确定的根;(2) 树根和子树根之间为有向关系
有序树:子树之间存在确定的次序关系
无序树:子树之间不存在确定的次序关系
下面通过一个例子来充分理解上面提到的那些概念和术语:
如下图所示
是m(m≥0)棵互不相交的树的集合。如图所示,任何一棵非空树是一个二元组,Tree = (root,F),其中:root 被称为根结点,F 被称为子树森林
线性结构:第一个数据元素(无前驱);最后一个数据元素(无后继);其它数据元素(一个前驱、一个后继)
树型结构:根结点(无前驱);多个叶子结点(无后继);其它数据元素(一个前驱、多个后继)。
或为空树;或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。二叉树的五种基本形态如图所示
性质 1 :在二叉树的第 i层上至多有2i-1 个结点。 (i≥1)可用归纳法证明
性质 2 :深度为 k 的二叉树上至多含2k-1 个结点(k≥1)
性质 3 :对任何一棵二叉树,若它含有n0叶子结点n2 个度为 2的结点,则必存在关系式:n0=n2+1
证明:
设二叉树上结点总数 n = n0+n1+n2
二叉树上分支总数 b = n1+2n2
b = n-1 = n0+n1+n2-1
满二叉树:指的是深度为k且含有2k-1个结点的二叉树。
完全二叉树:树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一一对应
实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素
特点:结点间关系蕴含在其存储位置中浪费空间,适于存满二叉树和完全二叉树
建立二叉树的顺序存储结构
voidMakeSeqBTree(SeqList *L)
{
char ch;
ch=getchar();
while(ch!=‘\n’)
{ if(ch!=‘ ‘)
InsertRear(L,ch);
ch=getchar();
}
}
数组下标i和二叉树层次间的关系
i>0,data[(i-1)/2]不是虚结点就是i的双亲,i=0是根
如果2i+1<L->size,data[2i+1]不是虚结点就是左孩子;2i+1>L->size,data[i]是叶子
如果2i+2<L->size,data[2i+2]不是虚结点就是右孩子;2i+2>L->size,data[i]无右孩子
i是偶数且>0,data[i-1]不是虚结点就是data[i]的左兄弟
如果i<L->size且是奇数,data[i+1]不是虚结点就是data[i]的右兄弟
顺序存储结构:
孩子表示法
应用范围:适用于二叉树上的结点个数已知,或不支持动态存储分配的高级语言
双亲表示法实现:定义结构数组存放树的结点,每个结点含两个域:
数据域:存放结点本身信息
双亲域:指示本结点的双亲结点在数组中位置
特点:找双亲容易,找孩子难
二叉链表
三叉链表
二叉树的建立是指在内存中建立二叉树存储结构。
二叉树的顺序存储结构的建立比较简单,只需将二叉树各个结点的信息(值)按原有的逻辑关系送入相应的向量单元中即可。
二叉树链式存储结构的建立算法有多种。
按完全二叉树的层次顺序,依次输入结点信息建立二叉链表的算法。对于一般的二叉树,必须添加若干个虚结点使其成为完全二叉树。
1。初始,顺序表中的第一个元素建立根结点,并将根指针入队
2。对顺序表的元素顺序扫描,如果不是虚结点,其结点指针恰是队头元素,则删除队头;如果该元素在表中有左右孩子,则建立左右孩子并与出队结点连接,孩子结点入队。
*******************************************************************************************************************************************************************************************************
2015-7-29
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/lg1259156776/article/details/47125223