---恢复内容开始---
此部分使用同一个结构体定义
typedef struct Tree { int val; struct Tree *left; struct Tree *right; }treenode ,*link;
- part 1
作业中的问题(第六次作业)
编程题
遇见的不会写的点:
1.层数标记
2.建立二叉搜索树
3.找到非二叉搜索树的二叉树中的特定结点位置函数(search_where)
4.找到两个结点最近的双亲结点(search_common_parent)
5.getword函数(从文件中读取的时候)与getch函数的不同需注意(词频统计)
6.链表下的二叉树和数组下的二叉树
二叉树的基本知识
基本知识
1.非空树的结点总数等于树中所有结点的度之和加1
2.度为k的非空树的第i层最多有k^(i-1)个结点
3.若非空二叉树有N0个叶节点,有n2个度为2的结点,则n0=n2+1
可以运用到顺序存储树的题目中
1.对具有n个结点的完全二叉树按照层次从上到下,每一层从左到右的次序对所有节点进行编号,标号为i的结点的双亲结点的编号是i/2,左孩子的编号是 2i ,右孩子的编号是 2i +1
2.在顺序存储的二叉树中编号为i,j的两个结点处在同一层的条件是 log2i = log2j(均为向下取整)
由遍历序列确定二叉树
知识缺漏
1.前缀表达式的计算式从后向前扫描
2.后缀表达式的计算式从前向后扫描
哈夫曼树需要学习的函数与知识点
1.合并二叉树
(1)如何同时遍历两个树或者三个树,函数只能返回一个参数的情况下
(2)对于每一个新的点,如果代入的两个点其中一个是null的话,那么这个null的点的 左子树和右子树都是空。所以要先初始化 一下。
这一点与作业问题中的3,4相同。
(3)要采用的是构建一个新的树,所以每次都要新初始化一个结点。
(4)指向新的树的结点的指针如何传递下去?
如何将新的树链接在一起?使用顺序存储?
代码如下
link mergeTrees( link t1,link t2) { link t; link left1=NULL, left2=NULL,right1=NULL,right2=NULL; t = (link)malloc(sizeof(treenode)); t->left = NULL; t->right = NULL; if( t1 == NULL && t2 == NULL) return NULL; else if(t1 != NULL && t2 != NULL) { t->val = (t1->val + t2->val); left1 = t1->left; right1 = t1->right; left2 = t2->left; right2 = t2->right; } else if(t1 != NULL && t2 == NULL) { t->val = t1->val; left1 = t1->left; right1 = t1->right; } else if(t1 == NULL && t2 != NULL) { t->val = t2->val; left2 = t2->left; right2 = t2->right; } t->left = mergeTrees(left1,left2); t->right = mergeTrees(right1,right2); return t; }
问题解答:(1)每次使用函数的参数将两个已经存在的树的当前指针传递下去
(2)使用函数的返回值 return t;将新的树的结点指针传递下去
(3)使用t->left = mergeTrees(left1,left2); t->right = mergeTrees(right1,right2);可以将新的树的结点之间连起来。
小总结:树相关问题的递归函数,都采用以下方式构建
(1)初始化新结点或新的指针
(2)解决特殊情况,(指向NULL)
search_where和search_common_parent函数中,指向NULL时返回t
mergetree函数中,指向NULL时返回NULL
(3)关键问题,在哪里写return?
2.哈夫曼树的基础知识
(一)
(1)树的权值:每个树节点所在的那个数字,权值,对应在编码中,即词或字出现的频率
(2)路径:两个结点之间所经过的分支
(3)路径长度:该结点的层数
(4)结点带权路径长度:结点的权值*该结点的路径长度
(5)树的带权路径长度:所有叶子结点的带权路径长度之和
(二)
(1)带权路径长度最小的树称为哈夫曼树,特别的,哈夫曼树并非满二叉树也不是完全二叉树
(2)哈夫曼树中不存在度为一的结点
(三)
总思路:
词频统计,词频排序(频率相同的字符A码值小的在前)
问题:文件中出现的字符都是可见字符,tab键读入的时候认为是4个空格键了
(1)构造哈夫曼树
算法描述:
构造树林
select函数,选择权值最小的两棵子树
(构造图解链接:
https://blog.csdn.net/qq_33990383/article/details/53073825)
函数要求:根据数组中的一组权值,构造哈夫曼树,并返回树根指针
规律:手动构造一个哈夫曼树,发现若有n个数值,则需要进行n-1次操作才能建立哈夫曼树
a.现构造树林,拆成一个个的树
b.采用稳定排序