1.4树
数据结构逻辑结构的一种
与线性表表示的一一对应的线性关系不同,树表示的是数据元素之间更为复杂的非线性关系。
直观来看,树是以分支关系定义的层次结构。树在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可以用树的形象来表示。
简单来说,树表示的是1对多的关系。
定义(逻辑结构):
树(Tree)是n( n>=0 )个结点的有限集合,没有结点的树称为空树,在任意一颗非空树中:
有且仅有一个特定的称为根(root)的结点
当n>1的时,其余结点可分为 m( m>0 ) 个互不相交的有限集T1,T2,…, Tm,其中每一个集合 Ti 本身又是一棵树,并且称之为根的子树。
注意:树的定义是一个递归定义,即在树的定义中又用到树的概念。
比如,这颗树,其中A是根,其余结点分成3个互不相交的子集:
T1={B, E, F, K, L}
T2={C, G}
T3={D, H, I, J}
T1, T2, T3 都是 A 的子树,且其本身也是一棵树。
比如T1, 其根为B, 其余结点分为两个互补相交的子集:
T11={E, K, L}
T12={F}
T11和T12都是T1的子树,且其本身也是一棵树。
…
1.4.1基本概念
一个结点的子树的根,称为该结点的孩子(儿子),相应的该结点称为子树的根的父亲。
A b c d
A 是BCD 父亲
BCD 是A的孩子
没有孩子的结点称为树叶,又叫叶子结点。
K L F G H I J
具有相同父亲的结点互为兄弟。
{b, c, d} {e, f}, {H , I, J}.
用类似的方法可以定义祖父和孙子的关系。
从父结点n1 到 nk 的路径定义为节点 n1 n2 … nk 的一个序列,使得对于 1 <= i < k,节点 ni是 ni+1 的父亲。这条路径的长是为该路径上边的条数,即 k-1。
从每一个结点到它自己有一条长为 0 的路径。
注意,在一棵树中从根到每个结点恰好存在一条路径。
如果存在从n1到n2的一条路径,那么n1是n2的一位祖先 ,而n2是n1的一个后裔。如果n1 != n2,那么n1是n2的真祖先, 而n2是n1的真后裔。
结点的层级从根开始定义,根为第一层,根的孩子为第二层。若某结点在第i层,则其孩子就在i+1层。
对任意结点ni,ni的深度为从根到ni的唯一路径的长。因此,根的深度为0。
ni 的高是从ni 到一片树叶的最长路径的长。因此,所有树叶的高都为0。
一颗树的高等于它根的高。一颗树的深度等于它最深的树叶的深度; 该深度总是等于这棵树的高。
如果一棵树有n个结点,那么它有n-1条边。
度: 含有子树的个数
出度: 含有子树的个数(发出几条边)
入度: (收到几条边, 被指向)
根节点
树中 n节点 x边
N <= x
X <= n
1.4.1.1转化树的结构
1.4.2二叉树
树中的一个特例
二叉树是一棵树,它的特点是每个结点至多有两棵子树。并且,子树有左右之分,其次序不能颠倒(有序)。
1.4.2.1特殊的二叉树
特殊的二叉树:完全二叉树、满二叉树和完美二叉树
完全二叉树: 如果一个节点, 在同一层级, 右侧没有节点, 那么这个节点就是这个树的最后一个节点(层级)
满二叉树: 度只有0 和 2
一个节点, 要么是叶子(没有任何子树), 要么左右子树都存在
完美二叉树: 每一个层级都是满的
Q1: 完美二叉树既是完全二叉树又是满二叉树? 对的
Q2: 如果一棵树既是完全二叉树又是满二叉树,那么它是完美二叉树? 不对
1.4.2.2二叉树的特点
二叉树具有以下重要性质:
二叉树在第i层至多有2的i-1次方个节点
1-1 2的0
2-2 2 的 1
K 2 的k-1
K+1 2 的 k
层次为k的二叉树至多有2的k次方-1个节点
1层 2的一次方 -1
2层 2的2次方 -1
K层 2的k次方 -1
K+1层(单这一层) 2k次方
整体 2的 k+1 次方 -1
对任何一颗二叉树T,如果其叶子节点数为n0 , 度为2的节点数为n2,则n0 = n2 + 1
边= n0+n1+n2-1
边=2n2 + n1
具有n个节点的完全二叉树,树的高度为log2n (向下取整)。
K层树: 2的k次方 -1
k-1层树: 2的k-1次方 -1
2的k-1次方 <=n<2的k次方
如果对一颗有n个结点的完全二叉树的结点按层序从1开始编号,则对任意一结点有:
如果编号i为1,则该结点是二叉树的根;
如果编号i > 1,则其双亲结点编号为 parent(i) = i/2,
若 2i > n 则该结点没有左孩子,否则其左孩子的编号为 2i,
若 2i + 1 > n 则该结点没有右孩子,否则其右孩子的编号为 2i + 1。
1.4.2.3二叉树的存储结构
1.4.2.4遍历
我们再来回顾一下二叉树的递归定义,可知,二叉树由3部分组成:根,左子树和右子树,因此如果能遍历这三个部分,便是遍历了整个二叉树。
假如以L, D, R分别表示左子树,根结点和右子树,则可能有DLR, LDR, LRD, DRL, RDL, RLD这六种遍历方案。
若限定先左后右,则只有DLR, LDR, LRD 这3种情况,分别称之为先 (根) 序遍历,中(根)序遍历,和后 (根) 序遍历。三者的区别主要在于访问根结点的先后顺序。
限定先左后右: 左右根, 左根右, 根左右
先序遍历: 先遍历根, 再遍历 左 再遍历 右
中序: 遍历左, 遍历根, 遍历 右
后续: 先左, 再右 再根