树:
树(Tree)是n(n>=0)个结点的有限集,它或为空树(n= 0); 或为非空树,对于非空树T:
- 有且仅有一个称之为根的结点;
- 除根结点以外的其余结点可分为m(m>0)个互不相交的有限集T1 , T2 , …,其中每
一个集合本身又是一棵树, 并且称为根的子树。
二叉树:
二叉树(Binary Tree)是n(n>=0)个结点所构成的集合,它或为空树(n= 0); 或为非空树,对于非空树T:
- 有且仅有一个称之为根的结点;
- 除根结点以外的其余结点分为两个互不相交的子集T1和T2, 分别称为T的左子树和右子
树,且T1和T2本身又都是二叉树。
二叉树和树的区别:
- 二叉树每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点);
- 二叉树的子树有左右之分,其次序不能任意颠倒。
顺序存储结构:
链式存储结构:
若二叉树为空,则空操作;否则
(1)访问根结点;
(2)先序遍历左子树;
(3)先序遍历右子树。
若二叉树为空,则空操作;否则
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历右子树;
若二叉树为空,则空操作;否则
(1)后序遍历左子树;
(2)后序遍历右子树;
(3)访问根结点
哈夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树
这种表示方法中, 以一组连续的存储单元存储树的结点,每个结点除了数据域data外,还附
设一个parent域用以指示其双亲结点的位置。这种存储结构利用了每个结点(除根以外)只有唯一的双亲的性质。在这种存储结构下, 求
结点的双亲十分方便, 也很容易求树的根,但求结点的孩子时需要遍历整个结构
由于树中每个结点可能有多棵子树,则可用多重链表, 即每个结点有多个指针域, 其中每个
指针指向一棵子树的根结点
又称二叉树表示法,或二叉链表表示法,即以二叉链表做树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点,分别命名为firstchild 域和nextsibling域
这种存储结构的优点是它和二叉树的二叉链表表示完全一样, 便千将一般的树结构转换为二叉树进行处理, 利用二叉树的算法来实现对树的操作。因此孩子兄弟表示法是应用较为普遍的一种树的存储表示方法
如果F={T1,T2,…,几}是森林,则可按如下规则转换成一棵二叉树B= (root, LB, RB)。
(1)若F为空,即m= o,'则B为空树;
(2)若F非空,即m"‘F-0, 则B的根root即为森林中第一棵树的根ROOT(T1 ); B的左子树
LB是从兀中根结点的子树森林F尸{T11, T12, …, T1m}转换而成的二叉树;其右子树RB是从森林
F’= {T2, T3 , …,几} 转换而成的二叉树
如果B= (root, LB, RB)是一棵二叉树,则可按如下规则转换成森林F={T1,T2 , …,Tm}:
(1)若B为空,则F为空;
(2)若B非空,则F中第一棵树兀的根ROOT(T1 )即为二叉树B的根root; T1中根结点的子> 树森林F1是由B的左子树LB转换而成的森林;F中除T1之外其余树组成的森林F’={T2 ,T3 , …}是由B的右子树RB转换而成的森林。
树和森林的遍历
当以二叉树的儿子兄弟表示树时
树的先根遍历和后根遍历可借用二叉树的先序遍历和中序遍历的算法实现:
树的先根遍历==二叉树的先序遍历
树的后根遍历==二叉树的中序遍历