树是递归定义的,因此,对于以树形为存储结构的数据,处理的算法首先想到的是递归。
树分二叉树和普通树,普通树可以转换为二叉树
【存储结构】
1、二叉树
(1)顺序存储
按完全二叉树的格式进行存储,如若不是完全二叉树,丢失的节点所相应的存储数组单元值为‘0’
(2)链式存储
含有左右孩子指针(有的含有双亲指针)的存储结构
(3)线索二叉树
比普通二叉树多了2个数据域,LTag和RTag,当一个节点的左或右指针域没有下挂节点时,分别指向前驱和后继节点
2、普通树
(1)双亲存储方式:
以顺序数组存储的方式开辟存储空间,节点内有一个域里包含双亲的位置信息,也就是数组的编号
(2)孩子存储方式
先根据树的层数创建一个指针数组,每个指针指向这一个层级的首个孩子,孩子之间才用链表式结构,每个孩子节点只有next指针域和数据域,next域指向同层的下一个孩子
(3)孩子兄弟存储方式
这种存储方式也叫二叉树存储法,节点含2个指针,左指针指向下一个层次的首个孩子,右指针指向同一层次的孩子(兄弟)节点
(可以用动态分配空间的方式一个一个节点地初始化)
3、霍夫曼树
毫无疑问链式结构,用动态存储的方式处理最好(用顺序存储也是可以的,但顺序存储有诸多不便,删除什么的,尽量少用)
首先建立哈夫曼树
再次生成哈夫曼编码,根据树生成编码有两种思路
(1)从叶子往根寻找双亲节点
(2)从根往叶子遍历
【算法】
树的建立和遍历有【递归】和【非递归】
【递归】隐式使用栈数据结构,比较清晰,树的定义就是递归的
【非递归】显式使用栈数据结构
遍历的话分(根)前序,中序,后续三种。采用递归的方式或者采用非递归+显式栈的方式实现