青岛大学数据结构与算法——第5章

一 概述

  • 树和二叉树的定义
  • 示例
  • 树和二叉树的抽象类型定义
  • 二叉树的性质和存储结构
  • 遍历二叉树和线索二叉树
  • 树和森林
  • 哈夫曼树

二 树和二叉树的定义

2.1 树的定义

n个节点的有限集

2.2 树的表示

  • 嵌套集合
  • 凹入表示
  • 广义表

2.3 术语

  • 结点:数据元素以及指向子树的分支
  • 根结点:非空树中无前驱结点的结点
  • 结点的度:结点拥有的子树数
  • 树的度:树内各结点的度的最大值
  • 树的深度:树中结点的最大层次
  • 叶子/终端结点:度=0
  • 分支结点/内部结点/非终端结点:度!=0
  • 孩子:结点的子树的根
  • 双亲:结点称为孩子双亲
  • 祖先:从根到该结点所经分支上的所有结点
  • 子孙:以某结点为根的子树中的任一结点
  • 有序树:树中结点的各子树从左到右有次序
  • 无序树:树中结点的各子树无次序
  • 森林:m(m>=0)颗互不相交的树的集合

2.4 树和线性结构的比较

  • 第一个元素
  • 最后一个元素
  • 其他元素

2.5 二叉树

  • 普通树为何转换为二叉树
  • 二叉树定义:1根+互不相交的左右子树
  • 特点:不存在度大于2的结点、左右之分,次序不能颠倒
  • 5中基本形态:空二叉树、根+空左右子树、根+左子树、根+右子树、根+左右子树

三 示例

  • 数据压缩问题
  • 二叉树求解表达式的值

四 树和二叉树的抽象类型定义

4.1 二叉树的抽象类型定义ADT BinaryTree

4.2 操作

  • CreateBiTree
  • PreeOrderTraverse
  • InOrderTraverse
  • PostOrderTraverse

五 二叉树的性质和存储结构

5.1 性质

  • i层最多有2^(i-1)结点
  • 深度为k的二叉树最多有2^k-1个结点
  • 叶子数为n0,度为2的结点数n2,则n0=n2+1
  • 具有n个结点的完全二叉树深度为log2n+1
  • 完全二叉树结点特征:双亲结点i/2、左孩子2i、右孩子2i+1

5.2 两种特殊形式

  • 满二叉树:深度k,有2^k-1个结点
  • 完全二叉树:满二叉树中,每个结点与编号对应(可不满)
  • 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树

5.3 存储结构

  • 顺序存储
  • 链式存储:二叉链表、三叉链表

六 遍历二叉树和线索二叉树

6.1 遍历二叉树

  • 遍历定义
  • 遍历目的
  • 遍历用途
  • 遍历方法:先(根)序遍历-DLR、中(根)序遍历-LDR、后(根)序遍历-LRD、二叉树的层次遍历
  • 示例:已知先序和中序,求二叉树、已知中序和后续,求二叉树
  • 应用:二叉树的建立、复制二叉树Copy、二叉树的深度Depth、二叉树结点总数NodeCount、叶子结点数LeadCount

6.2 线索二叉树

  • 概念:线索(加上了指向的指针)、线索二叉树(加上了线索的二叉树)
  • 结构:lrchild-指向孩子的指针、rchild-指向孩子的指针、ltag、rtag

七 树和森林

7.1 树

  • 概念:n个结点的有限集
  • 存储结构:双亲表示法、孩子链表、孩子兄弟表示法
  • 树与二叉树的转换

7.2 森林

  • 概念:m颗不相交的树的集合
  • 森林与二叉树的转换

八 哈夫曼树

8.1 示例引入

  • 将学生的百分制成绩转换为五分制成绩
  • 最优二叉树

8.2 概念

  • 路径
  • 结点的路径长度
  • 树的路径长度
  • 结点的带权路径长度
  • 树的带权路径长度

8.3 说明

  • 满二叉树不一定是哈夫曼树
  • 哈夫曼树中权越大的叶子离根越近

8.4 应用

  • 哈夫曼算法
  • 哈夫曼编码
  • 哈夫曼编码-解码

九 图示