1.树的定义:其是n(n>=0)个节点的有限集。n=0时为空树。在任意一颗飞空树中:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可以分为m个互不相交的有限集,其中每一个集合本身都是一棵树,并且称之为根的子树;
2.树的基本概念:子树的数目称为节点的度;孩子,双亲,兄弟,层次,树中结点最大层次称为树的深度或高度;
3.树是一对多的结构,不论是顺序存储还是链式存储都不恩能够单独的直接反映出逻辑关系;而需要充分利用两者的优点来完成树的物理实现;
(1)双亲表示法:其中parent为指针域指向本节点的双亲结点!
data | parent |
(2)孩子表示法:
每个结点的孩子结点排列起来,用单链表作为存储结构,则n个结点就有n个孩子链表;然后这n个头指针又组成一个线性表,采用顺序存储结构,存放在一个一维数组中;容易得到孩子的某个结点的孩子,但是得到双亲比较难;
child | next |
data | firstchild |
data | firstchild(指针域) | rightsib(指针域右兄弟) |
4.Binary Tree(二叉树)是n个结点的有限集合(n>=0).该集合或者为空集,或者由一个根节点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成!
其特性为树的度不大于2;
左右子树是有顺序的;同样高度的完全二叉树的节点数<满二叉树;满二叉树肯定是完全二叉树;
5.由于二叉树的特殊性,是可以顺序存储来实现的。使用下标来反映结点在二叉树中的位置即可;
6.二叉链表:每个节点最多有两个孩子;即是一个数据域,两个指针域;
lchild | data | rchild |
7.二叉树的遍历:traversing binary tree:是指从根结点出发,按照某种次序一次访问二叉树中的所有节点,使得每个结点被访问一次且仅被访问一次;
前序遍历,中序遍历,后序遍历,层序遍历;
8.线索二叉树:具有指向前继和后继的指针的二叉表;其实等于把一颗二叉树变成了一个双向链表!!!线索化的实质就是降二叉链表的空指针改为指向前驱或后继的线索。
9.赫夫曼树,即为带权路径最小的二叉树;
10.一般的,设需要编码的字符集为{d1,...dn},各个字符在电文中出现的次数或频率为{w1,....wn},以{d1,...dn}作为叶子节点,以w1...wn作为相应节点的权值来构造一颗赫夫曼树。规定赫夫曼树的左分支代表0,右分之代表1,则从根节点到叶子节点所经过得路径分支组成的0或1的序列便为该节点对应的字符编码,这就是赫夫曼编码!