树形结构是一中重要的非线性结构。
在任意一棵非空树中,有且仅有一个根结点。
当总结点树n大于1时,其余节点可分为m个互不相交的有限集T1,T2,……,Tm,其中每个集合本身也是一棵树,称为根的子树。
树的结点包括一个数据元素以及若干个指向其子树的分支,结点拥有子树数称为结点的度。度为零的结点称为叶子(或终端结点);度不为零的结点称为分支结点(或非终端结点)。除根结点外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。
结点子树的根称为该结点的孩子(child),该结点称为孩子的双亲(parent)。结点的层次从根开始定义,根为第一层。结点双亲在同一层的结点互为堂兄弟。树中结点的最大层次称为树的深度。
如果树中结点的各子树看成从左到右是有次序的,则称该树为有序树,否则称为无序树。
森林是m棵互不相交的树的集合。
二叉树:每个结点最多只有两个子树,且有左右之分,顺序不能颠倒。(二叉树中所有的结点的度不大于2)
完全二叉树:深度为k,有n个结点的二叉树。当且仅当每一个结点都与深度为k的满二叉树中编号从1至n一致时,称为完全二叉树。
满二叉树:一棵深度为k且具有2^k - 1个结点的二叉树。
性质:
1. 在二叉树的第i层上至多有2^(i+1)个结点。(满二叉树)
2. 深度为k的二叉树至多有2^k - 1个结点。
3. 对任何一棵二叉树,如果其终端结点的数量为m,度为2的结点数为n,则m=n+1
4. 具有n个结点的完全二叉树深度为log2(n) + 1
5. 如果一棵有n个结点的完全二叉树的结点按层序编号,则对任意结点i:
(1)如果i=1, 则结点是二叉树的根,无双亲;如果i>1,则其双亲是编号为 i/2 的结点
(2)如果2i>n,则结点i无左孩子;否则其左孩子为编号为2i的结点
(3)如果2i+1>n,则结点i无右孩子;否则右孩子为编号为2i+1的结点
遍历二叉树:使每个节点都被访问一次,且只被访问一次。
1. 先序遍历:
(1)先访问根节点
(2)先序遍历左子树
(3)先序遍历右子树
2. 中序遍历:
(1)中序遍历左子树
(2)访问根节点
(3)中序遍历右子树
3. 后序遍历:
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根节点
赫夫曼树:又称最优二叉树。
路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径
路径长度:路径上分支数目。树的路径长度是从根结点到每个结点的路径长度之和。
树的带权路径长度为:树中所有叶子结点的带权路径长度之和。
赫夫曼树为:假设有n个权重,构造有n个叶子结点的二叉树,树的带权路径长度最小的为赫夫曼树。
森林:多个树
二叉树和森林之间的转换:森林中的第一颗树的根节点为二叉树的根节点;子树向左,同级向右。