树形结构
树形结构是一种非线性结构,树中每个结点的都有关系性,生活中族谱、大学机构等都是树形结构,在计算机中编译程序用来表示源代码的语法结构,数据库索引,计算机图形表示图像关系等。
树的定义是,n(n >= 0)个结点的有限集T。它或是空集(空树即 n = 0),或者非空集。对于任意一棵非空树,有且仅有一个特定为根结点,当n > 1时,其余结点可以分为m个互不相交的有限集,其中每个集合本身又是一棵树,并称为根的子树
树的表示方法有,树形表示,嵌套集合表示,凹型表示,广义表表示。
对于树重要概念:
1.度,一个结点拥有的子树数称为该结点的度,一棵树中最大度数称为树的度。度数为0的结点称为叶子或终端结点。
2.深度,树的层次从根开始计算,树中结点最大层次数为数的深度或高度。
3.树中结点的各子树看成从左到右依次有序排列且不能交换,称为有序树,否则无序树。
4.森林,是m(m > = 0)棵互不相交的树的集合,若一棵树根结点删除,就获取该树的子树构成的森林,如果把森林所有树作为子树,用一个根结点把子树连接起来,森林变成一棵树。
二叉树定义是n个结点有限的集合,它的每个节点至多有两个子树。有满二叉树和完全二叉树,满二叉树只有度为2的结点,完全二叉树是满足最深层的叶子结点都在左边位置。
二叉树的性质:
1.在二叉树的第i层至多有2^(n-1)个结点。
2.深度为k的二叉树至多有2^k-1个结点(k>=1)。
3.对于任何一棵二叉树,若终端结点数为n0,度数为2的结点为n2,,则n0=n2+1。
4.具有n个结点的完全二叉树的深度为[logn] + 1 或 [log(n+1)]。
二叉树的存储结构
1.顺序存储具有n个结点的完全二叉树时,从树根从上到下依次每层从左往右给每个结点编号,并获得一个线性表,但是如果不是完全二叉树就会产生存储空间的浪费。
2.链式存储结构一般每个结点设置三个域,值域、左指针域和右指针域。如果方便查找父节点可以添加一个parent域。
二叉树的生成方式:
1.按广义表表示二叉树结构生成二叉链表的算法。
2.按完全二叉树的层次顺序依次输入结点信息建立二叉链表的算法。
二叉树的遍历:
1.递归遍历:前序遍历,中序遍历,后序遍历。
2.非递归遍历:栈遍历,队列遍历。
二叉树的线索化:对于一棵二叉线索链表结构中所以结点的空指针域按照某种遍历次序加线索的过程称为线索化。线索化为了有效利用存储空间进一步利用二叉树的通过转换成二叉双向链表的方式。
具体思路:
(1)如果根结点的左孩子指针域为空,就把前驱结点的指针赋给根结点左指针。
(2)如果根结点的右孩子指针域为空,就把后继节点的指针赋给根结点右指针。
(3)将根结点赋给存给前驱指针的变量,方便下次访问时获取根结点的前驱结点。
最优二叉树(哈夫曼树):带权路径长度最短的树。完全二叉树是最优二叉树的代表例子。
结点的带权路径长度:树根到某结点之间的路径长度与该结点上的权的乘积。
树的带权路径长度:树中所有叶子结点的带权路径之和。
构建哈夫曼树算法思想:
(1)根据n个权值和n个结点对应构成n棵二叉树的森林F,其中每棵二叉树都只有一个权值的根结点,左右子树都是空。
(2)在森林F选两个根结点权值最小的树作为新树的左右子树,且把新树的根结点权值换成最小子树的权值之和。
(3)F删除选择的两个树,添加新树到F中。
(4)重复2,3步,直到F只有一棵树为止。