树与森林转

树的存储结构

 

双亲表示法(顺序存储)

用一组连续的存储空间来存储树的节点,同时在每个节点中附加一个指示器(整数域),用以指示双亲结点的位置(下标值)。

#define MAX_TREE_SIZE 100//树中最多节点数
typedef struct 
{
	ElemType data;//数据元素
	int parent;
}PTNode;
typedef struct{
	PTNode nodes[MAX_TREE_SIZE];
	int n;//节点数
}PTree;

孩子链表表示法(顺序加链式存储)

struct CTNode{
	int  child;//孩子节点在数组中的位置
	struct CTNode *next;//下一个孩子
};
typedef struct{
	ElemType data;
	struct CTNode *firstChild;//第一个孩子
}CTBox;
typedef struct{
	CTBox nodes[MAX_TREE_SIZE];
	int n,r;//节点数和根的位置
}CTree;

孩子兄弟表示法(链式存储)

typedef struct CSNode{
	ElemType data;
	struct CSNode *firstchild,*nextsibling;//第一个孩子和右兄弟指针
}CSNode,*CSTree;

树的先根遍历和后根遍历

若树非空,先访问根节点,再依次对每颗子树进行先根遍历。

//树的先根遍历
void PreOrder(TreeNode *R){
	if(R!=NULL){
		visit(R);//访问根节点
		while(R还有下一个子树T)
			PreOrder(T);
	}
}

//树的先根遍历
void PostOrder(TreeNode *R){
	if(R!=NULL){
		
		while(R还有下一个子树T)
			PostOrder(T);
		visit(R);//访问根节点
	}
}

 哈夫曼树(最优二叉树)

  1. 节点的权:有某种现实含义的数值(如:表示节点的重要性等)
  2. 节点的带权路径长度:从树的根到该节点的路径长度(经过的边数)与该节点上权值的乘积。
  3. 树的带权路径长度:树中所有叶节点的带权路径长度之和。(WPL)
  4. WPL最小的为哈夫曼树

 构造哈夫曼树树与森林转_第1张图片

  1.  可变长度编码:允许对不同字符用不等长的二进制表示
  2. 前缀编码:若没有一个编码是另一个编码的前缀,则称这样的编码前缀编码

你可能感兴趣的:(数据结构,链表,数据结构)