数据结构-树-学习笔记

 

树的相关定义:

1.度

结点的度:结点的子树的个数;

树的度:结点度的最大值;

2.深度

结点的层次:从根开始(第一层),依次往后瑞;

深度:节点最大层次;

  1. 有序树,无序树

字面理解, 子树从左至右有无顺序;

  1. 森林:m棵不相交树;

树的存储结构:

存储结构:

  1. 顺序结构;
  2. 链式结构;

表示方法:

  1. 双亲表示法;
  2. 孩子表示法;
  3. 孩子兄弟表示法;★

孩子兄弟表示法

两个指针,指向该节点第一个孩子和右兄弟;

二叉树

定义:n个结点的有限集合,该集合由一个根节点和互不相交的、分别成为根节点的左子树和右子树的二叉树组成。(或空集,空二叉树)

二叉树特点:

  1. 度:二叉树度<=2 :因为每个结点最多两个子树,(但不是一定有两个结点,有可能有1/0个结点)
  2. 有序树:区分左子树和右子树;

特殊二叉树:

  1. 满二叉树:每个结点都存在左右子树,所有叶子在同一层;(共2^n-1满的)
  2. 完全二叉树:★(只有最后一行没满)

完全二叉树的特点:
1.叶子结点只能出现在最下面两侧;

最下面一层的叶子在左部连续部分;

倒数第二层,如果有叶子,则一定在右部;

  1. 结点度为1,则结点只有左孩子(不可能只有右孩子,不连续);
  2. 同样结点数的二叉树,完全二叉树的深度最小;

二叉树的代数性质:

  1. 第i层最多有2^(i-1)个结点;
  2. 深度为k的结点至多有2^i-1个结点;
  3. 叶子结点数=度为2的节点数+1;
  4. n个结点的二叉树的深度是[log2n]+1;

二叉树的遍历:(重点题型!!!)

  1. 前序遍历:亲,左孩子,右孩子(先访问根节点,后
  2. 中序遍历:左孩子,亲,有孩子
  3. 后序遍历:左孩子,有孩子,亲

(先,中,后代表的是根节点相对两个孩子的位置)

易考题型:

  1. 先序遍历+中序遍历->后序遍历(知二推一)
  2. 后序遍历+中序遍历_>先序遍历
  3. 由前序遍历+后序遍历不能推到中序遍历。(两者不能唯一确定二叉树)

树的存储结构:

  1. 双亲表示法;储存每一个结点的双亲
  2. 孩子表示法;储存每一个结点的孩子
  3. 孩子兄弟表示法;储存每个结点的右兄弟和第一个孩子;

(转化成用二叉链表表示)

树的结构转换

树<-->二叉树

二叉树

结点X的第一个孩子

结点X的左孩子

结点X的右兄弟

结点X的右孩子

树转化成二叉树的步骤

  1. 加线:兄弟结点之间加线;
  2. 去线:只保留每个结点与第一个左孩子的连线,删掉与其他孩子的连线;
  3. 转轴;

森林转化成二叉树

森林:把每一棵树的根节点理解成兄弟;

二叉树转化成森林

二叉树->树(根节点只有左孩子)

二叉树->森林(根节点有左右孩子)

哈夫曼树

最优二叉树:带权路径长度最小

Ps:带权路径:从根到该结点的路径长度与结点的权的乘积

★哈夫曼树的构造方法

  1. 将所有带权结点按照权值从小到大排列;
  2. 选择最小的两个结点作为新节点N1的左右孩子(小的左,大的右)
  3. 用构成的新节点替换原来的两个小结点,循环开始;
  4. 直到最后只剩下一个树,这个树就是哈夫曼树。

哈夫曼编码:(可以压缩数据长度)

最优前缀编码,根据字符出现的频率编码,使得到的电文长度最短。

前缀编码:长短不一的编码,任一字符的编码都不是另一个字符的编码的前缀(防止混淆)

具体编码过程:

  1. 以字符出现的频率为权,构造哈夫曼树;
  2. 结点指向左孩子的分支记为“0”,右孩子的分支为“1”。

具体译码过程

1.从根结点开始,0——>向左走,1-->向右走,直到遇到叶子结点为止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值