二叉树的相关笔记

---恢复内容开始---

此部分使用同一个结构体定义

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.采用稳定排序

        

猜你喜欢

转载自www.cnblogs.com/emilyyogurt/p/9081099.html