Tree_Forest_Huffuman

树的存储表示

双亲表示法

  • 树的双亲表示法的存储结构
  • 现:定义结构数组存放树的结点,每个结点含两个域
  • 数据域:存放结点本身信息
  • 双亲域:指示本结点的双亲结点在数组中位置
  • 特点:找双亲容易,找孩子难
1
2
3
4
5
6
7
8
9
10
11
#define MAX_TREE_SIZE    100
typedef struct PTNode
{
TElemType data; // 数据元素
int Parent; // 双亲结点在存贮区中的位置
}PTNode;
typedef struct
{
PTNode Nodes[ MAX_TREE_SIZE ];
int n; // 结点数
}PTree;

孩子表示法

  • 多重链表:每个结点有多个指针域,分别指向其子树的根

任何一个数据域,有0个或多个孩子

  • 链式存储结构,其结点除放置数据元素外,还可以放置若干指针,分别用来指示该结点的所有孩子结点在存储空间中的位置

带双亲的孩子链表

孩子兄弟表示法

  • 实现:用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其第一个孩子结
  • 特点
  • 操作容易
  • 破坏了树的层次
1
2
3
4
5
6
typedef struct CSNode
{
TElemType data;
struct CSNode *pFirstChild;
struct CSNode *pNextSibling;
}CSNode, *CTree;

森林与二叉树转换

树转换为二叉树

  • 加线:在兄弟之间加一连线
  • 抹线:对每个结点,除了其左孩子外,去除其与其余孩子之间的关系
  • 旋转:以树的根结点为轴心,将整树顺时针转45°

二叉树转换为树

  • 加线:沿分支找到的所有右孩子,都与p的双亲用线连起来
  • 抹线:抹掉原二叉树中双亲与右孩子之间的连线
  • 调整:将结点按层次排列,形成树结构

森林转换为二叉树

  • 将各棵树分别转换成二叉树
  • 将每棵树的根结点用线相连
  • 以第一棵树根结点为二叉树的根,再以根结点为轴心,顺时针旋转,构成二叉树型结构

二叉树转换成森林

  • 抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成孤立的二叉树
  • 还原:将孤立的二叉树还原成树

树的遍历

先根、后根、层序遍历

森林遍历

先序、中序 没有后序(不然就把一棵树割裂了)

哈夫曼树Huffman

带权路径长度最短的树

考题

哈夫曼编码