SlideShare a Scribd company logo
第 6 章 树和二叉树
6.1 树及其抽象数据类型
6.2 二叉树及其抽象数据类型
6.3 二叉树的表示和实现
6.4 线索二叉树
6.5 Huffman编码与Huffman树
6.6 树的表示和实现
本章是数据结构课程的重中之重,也是难
点所在,表现为二叉链表存储结构和递归算
法相结合。链式存储结构和递归算法本身就
是两个难 点,建立二叉树需要将它们
目的和要求
 目的:理解树型结构;掌握链式存储结构表达
非线性结构,掌握递归算法设计。
• 内容:二叉树的定义、性质、存储结构,二叉
链 表表示的二叉树类;中序线索二叉树;
Huffman 树;树的定义、存储结构和实现。
• 要求:理解树和二叉树概念,掌握树和二叉树
的 表示和实现,掌握递归算法设计。
• 重点:二叉链表表示的二叉树类; Huffman 树
;树 的定义、存储结构和构造算法。
• 难点:链式存储结构表达非线性结构;递归算
法 设计。
• 实验:树和二叉树的基本操作,链式存储
结 构表示树和二叉树;递归算法。
《数据结构( Java 版)(第 3 版)》
6.1 树及其抽象数据类型
6.1.1 树定义 6.1.2 树的术
语
6.1.3 树的表示法 6.1.4 树抽象数
据类型
《数据结构( Java 版)(第 3 版)》
6.1.1 树定义
树( tree )是由 n ( n≥0 )个结点组
成的有限集合。 n=0 的树称为空树; n>0
的树 T :
根( root )结点,它没有前驱结点。
其他结点分为 m 棵互不相交的子树。
《数据结构( Java 版)(第 3 版)》
6.1.2 树的术语
1. 父母、孩子与兄弟结点
2. 度
3. 结点层次、树的高度
4. 边、路径
5. 无序树、有序树
6. 森林
《数据结构( Java 版)(第 3 版)》
6.1.3 树的表示法
1. 图示法
2. 横向凹入表示法
A
B
E
F
C
G
D
H
I
J
3. 广义表表示
A(B(E, F), C(G), D(H, I,
J))
《数据结构( Java 版)(第 3 版)》
6.1.4 树抽象数据类
型
public interface TTree<T> // 树接口
{ boolean isEmpty(); // 判断是否空树
TreeNode<T> getChild(TreeNode<T> p,int i);// 返回 p 第 i 个孩
子
TreeNode<T> getParent(TreeNode<T> node);// 返回 node 的父
母
int count(); // 树的结点个数
int height(); // 树的高度
TreeNode<T> search(T x); // 查找并返回元素为 x 的
结点
void preOrder(); // 先根次序遍历树
void postOrder(); // 后根次序遍历树
void levelOrder(); // 按层次遍历树
void insertRoot(T x); // 插入元素 x 作为根结
《数据结构( Java 版)(第 3 版)》
6.2 二叉树及其抽象数据类型
6.2.1 二叉树定义
6.2.2 二叉树性质
6.2.3 二叉树的遍历
6.2.4 二叉树抽象数据类型
《数据结构( Java 版)(第 3 版)》
6.2.1 二叉树定义
二叉树( binary tree )是 n 个结点的有限
集合:
 空二叉树;
 由一个根结点、两棵互不相交的左子树和
右子树组成。
《数据结构( Java 版)(第 3 版)》
6.2.2 二叉树性质
性质 1 :若根结点的层次为 1 ,则二叉树
第 i 层最多有 2i
−1 ( i≥1 )个结点。
性质 2 :在高度为 k 的二叉树中,最多有
2k
−1 个结点( k≥0 )。
性质 3 :设一棵二叉树的叶子结点数为
n0 , 2 度结点数为 n2 ,则 n0=n2+1 。
《数据结构( Java 版)(第 3 版)》
性质 4 : n 个结点完全二叉树的高度是
。
性质 5 :一棵具有 n 个结点的完全二叉树,对序号为
i ( 0≤i<n )的结点,有:
a. 若 i=0 ,则 i 为根结点,无父母结点;若 i >0 ,则 i 的父
母结点序号为。
b. 若 2i+1<n ,则 i 的左孩子结点序号为 2i+1 ;否则 i 无
左孩子。
c. 若 2i+2<n ,则 i 的右孩子结点序号为 2i+2 ;否则 i 无
  1log2 += nk
《数据结构( Java 版)(第 3 版)》
6.2.3 二叉树的遍历
先根次序:访问根结点,遍历左子树,遍历右子树
。
中根次序:遍历左子树,访问根结点,遍历右子树
。
后根次序:遍历左子树,遍历右子树,访问根结点
。
《数据结构( Java 版)(第 3 版)》
6.2.4 二叉树抽象数据类型
public interface BinaryTTree<T>
{ boolean isEmpty(); // 判断是否空
int count(); // 返回结点个数
int height(); // 返回高度
void preOrder(); // 先根次序遍历
void inOrder(); // 中根次序遍历
void postOrder(); // 后根次序遍历
void levelOrder(); // 按层次遍历
BinaryNode<T> search(T key); // 查找
BinaryNode<T> getParent(BinaryNode<T> node);// 返回父母
void insertRoot(T x); // 插入元素 x 作为根结点
BinaryNode<T> insertChild(BinaryNode<T> p, T x, boolean
leftChild);
void removeChild(BinaryNode<T> p, boolean leftChild);
void removeAll(); }
《数据结构( Java 版)(第 3 版)》
6.3 二叉树的表示和实现
6.3.1 二叉树的存储结构
6.3.2 二叉树的二叉链表实现
6.3.3 三叉树的二叉链表实现
《数据结构( Java 版)(第 3 版)》
6.3.1 二叉树的存储结构
1. 二叉树的顺序存储结构
《数据结构( Java 版)(第 3 版)》
2. 二叉树的链式存储结构
 二叉链表
 三叉链表
《数据结构( Java 版)(第 3 版)》
6.3.2 二叉树的二叉链表实现
1. 二叉树的二叉链表结点类
public class BinaryNode<T>
{ T data; // 数据元素
BinaryNode<T> left, right; // 左、右孩子
}
2. 二叉树类
public class BinaryTree<T> implements
BinaryTTree<T>
{ BinaryNode<T> root; // 根结点 }
《数据结构( Java 版)(第 3 版)》
3. 二叉树三种次序遍历的递归算
法
// 先根次序遍历以 p 结点为根的子树
private void preOrder(BinaryNode<T> p)
{ if (p!=null) // 若二叉树不空
{ System.out.print(p.data+" "); // 访问当前
结点
preOrder(p.left); // 按先根次序遍历左子树
preOrder(p.right); // 按先根次序遍历右子树
}
}
《数据结构( Java 版)(第 3 版)》
4. 基于遍历的操作
a. 求结点个数
b. 求高度
c. 查找
d. 获得父母结点
《数据结构( Java 版)(第 3 版)》
5. 构造二叉树
( 1 )先根和中根序列表示
《数据结构( Java 版)(第 3 版)》
( 2 )标明空子树的先根序列
表示
【例 6.2 】 输出二叉树中指定结点的所有祖先结
点。
《数据结构( Java 版)(第 3 版)》
( 3 )广义表表示
《数据结构( Java 版)(第 3 版)》
( 4 )以完全二叉树的层次遍历
序列构造链式存储结构的完全二
叉树
【例 6.3 】 建立二叉链表表示的完全二叉树
。
《数据结构( Java 版)(第 3 版)》
6. 二叉树的插入和删除操
作
( 1 )插入一个结点
( 2 )删除一棵子树
《数据结构( Java 版)(第 3 版)》
7. 二叉
树遍历的
非递归算
法
《数据结构( Java 版)(第 3 版)》
8. 二叉树的层次遍历
《数据结构( Java 版)(第 3 版)》
6.3.3 三叉树的二叉链表
实现
1. 二叉树的三叉链表结点类
public class TriNode<T>
{ public T data; // 数据
域
public TriNode<T> parent, left,
right; // 父母结
点、左和右孩子结点
《数据结构( Java 版)(第 3 版)》
2. 三叉链表表示的二叉树类
public class TriBinaryTree<T>
{
public TriNode<T> root; // 根结
点
}
( 1 )构造二叉树
《数据结构( Java 版)(第 3 版)》
( 2 )插入结点
例 6.4 输出三叉链表存储二叉树的一条直
径。
《数据结构( Java 版)(第 3 版)》
6.4 线索二叉树
6.4.1 线索二叉树定义
0 leftÖ¸Ïò ×óº¢×Ó
ltag
1 left Ϊ Ï ßË÷ £¬ Ö¸Ïò Ç°Çý½áµãC

= 

0 right
rtag
1 right Ϊ Ï ßË÷ £¬ Ö¸Ïò ºó ¼Ì½áµãC

= 

《数据结构( Java 版)(第 3 版)》
6.4.2 中序线索二叉树
1. 二叉树的中序线索化
2. 中序线索二叉树类
3. 中根次序遍历中序线索二叉树
【例 6.5 】 构造中序线索二叉树并进行中根次
序遍历。
4. 先根次序遍历中序线索二叉树
5. 后根次序遍历中序线索二叉树
《数据结构( Java 版)(第 3 版)》
1. 二
叉树
的中
序线
索化
《数据结构( Java 版)(第 3 版)》
2. 中序线索二叉树类
public class ThreadBinaryTree<T>
{
public ThreadNode<T> root;
}
3. 中根次序遍历中序线索二叉树
《数据结构( Java 版)(第 3 版)》
4. 先根次序遍历中序线索二叉
树
《数据结构( Java 版)(第 3 版)》
5. 后根次序遍历中序线索二叉
树
《数据结构( Java 版)(第 3 版)》
6.5 Huffman 编码与 Huffman
树 6.5.1 Huffman 编码
存储“ AAAABBBCDDBBAAA” ,字符集
[A 、 B 、 D 、 C] ,字符出现次数为
7 、 5 、 2 、 1 ,频率为 0.47 、 0.33 、 0.13 、
0.07 ,哈夫曼编码过程为:
A A A A B B B C D D B B A A A
0 0 0 0 10 10 10 111 110 110 10 10 0 0 0
《数据结构( Java 版)(第 3 版)》
6.5.2 Huffman 树
1. 二叉树的路径长度
∑
−
=
=
1
0
PL
n
i
il
《数据结构( Java 版)(第 3 版)》
2. 二叉树的外路径长度
《数据结构( Java 版)(第 3 版)》
3. 二叉树的带权外路径长度
1
0
WPL ( )
n
i i
i
w l
−
=
= ×∑
《数据结构( Java 版)(第 3 版)》
4. Huffman 算法
哈夫曼树定义为带权外路径长度最短的二叉
树。
哈夫曼树不唯一
《数据结构( Java 版)(第 3 版)》
构造 Huffman 树并获得 Huffman
编码
5. Huffman 编码的译码
《数据结构( Java 版)(第 3 版)》
例 6.6 构造 Huffman 树并获得
Huffman 编码。<1> 采用静态三叉链表存储 Huffman
树
《数据结构( Java 版)(第 3 版)》
图 6-44 Huffman 树和 Huffman
编码
若权值集合 {5,29,7,8,14,23,3,11} 对应字
符 A ~ H
《数据结构( Java 版)(第 3 版)》
<2> 存储 Huffman 编码
《数据结构( Java 版)(第 3 版)》
6.6 树的表示和实现
6.6.1 树的遍历
6.6.2 树的存储结构
6.3.3 树的孩子兄弟链表实现
《数据结构( Java 版)(第 3 版)》
6.6.1 树的遍历
1. 树的先根遍历算法描述如下:
a. 访问根结点。
b. 按照从左到右的次序先根遍历根的每一棵子
树。
2. 树的后根遍历算法描述如下:
a. 按照从左到右的次序后根遍历根的每一棵子
树。
b. 访问根结点。
《数据结构( Java 版)(第 3 版)》
6.6.2 树的存储结构
1. 孩子
链表
2. 孩子
兄弟
链表
《数据结构( Java 版)(第 3 版)》
6.3.3 树的孩子兄弟链表
实现
1. 树的孩子兄弟链表结点类
public class TreeNode<T>
{
public T data; // 数据域
public TreeNode<T> child,
sibling;
// 孩子、兄弟结点
}
《数据结构( Java 版)(第 3 版)》
2. 树类声明
public class Tree<T> implements
TTree<T>
{
public TreeNode<T> root; // 根结
点
}
3. 树的遍历
4. 返回结点
a. 返回最后一个兄弟结点
《数据结构( Java 版)(第 3 版)》
5. 插入结点
1. 插入根结点
2. 插入兄弟结点
《数据结构( Java 版)(第 3 版)》
6. 以横向凹入表示构造树或森
林
例 6.8 以树的横向凹入表示构造树或森林。
《数据结构( Java 版)(第 3 版)》
7. 树的广义表表示
例 6.9 树的广义表表示及构造。
中国 ( 北京 , 上海 , 江苏 ( 南京 , 苏州 ,
无锡 ), 浙江 ( 杭州 , 宁波 , 温州 ), 广
东 ( 广州 )), 韩国 ( 首尔 ), 美国 ( 华
盛顿 )

More Related Content

Viewers also liked

El Gran Marques Hotel & Spa, les da la bienvenida
El Gran Marques Hotel & Spa, les da la bienvenida El Gran Marques Hotel & Spa, les da la bienvenida
El Gran Marques Hotel & Spa, les da la bienvenida
El Gran Marques
 
Primera linea de vida
Primera linea de vidaPrimera linea de vida
Primera linea de vida
Francisko Muñoz
 
Trabajo practico nº1 tic
Trabajo practico nº1 ticTrabajo practico nº1 tic
Trabajo practico nº1 tic
yesica
 
Tutoría en entornos virtuales (moodle)
Tutoría en entornos virtuales (moodle)Tutoría en entornos virtuales (moodle)
Tutoría en entornos virtuales (moodle)
silviagarcia66
 
Nouveau Titanic
Nouveau TitanicNouveau Titanic
Nouveau Titanic
Luiz Carlos Dias
 
Sicilia
SiciliaSicilia
Etica
EticaEtica
Etica
lchavo
 
Agropecuria
AgropecuriaAgropecuria
Agropecuria
Jh ErSon So Lozano
 
Graduarme en la escuela
Graduarme en la escuelaGraduarme en la escuela
Graduarme en la escuela
davidpuca
 
Ghandi - Paz
Ghandi - PazGhandi - Paz
Ghandi - Paz
Luiz Carlos Dias
 
The entertainer-level-five
The entertainer-level-fiveThe entertainer-level-five
The entertainer-level-fiveVennella Sandah
 
Dubai yacht charter
Dubai yacht charterDubai yacht charter
Dubai yacht charter
Harrish Martin
 
Choices nutri lean-presenter_slides
Choices nutri lean-presenter_slidesChoices nutri lean-presenter_slides
Choices nutri lean-presenter_slides
JuliaSkan
 
Ambato de tierra de flotres y fruta
Ambato de tierra de flotres y frutaAmbato de tierra de flotres y fruta
Ambato de tierra de flotres y fruta
IVANSAILEMA15
 
Sosutattoo
SosutattooSosutattoo
As 12 maiores cidades do mundo
As 12 maiores cidades do mundoAs 12 maiores cidades do mundo
As 12 maiores cidades do mundo
Luiz Carlos Dias
 
Combustión
CombustiónCombustión

Viewers also liked (20)

El Gran Marques Hotel & Spa, les da la bienvenida
El Gran Marques Hotel & Spa, les da la bienvenida El Gran Marques Hotel & Spa, les da la bienvenida
El Gran Marques Hotel & Spa, les da la bienvenida
 
Primera linea de vida
Primera linea de vidaPrimera linea de vida
Primera linea de vida
 
Trabajo practico nº1 tic
Trabajo practico nº1 ticTrabajo practico nº1 tic
Trabajo practico nº1 tic
 
Tutoría en entornos virtuales (moodle)
Tutoría en entornos virtuales (moodle)Tutoría en entornos virtuales (moodle)
Tutoría en entornos virtuales (moodle)
 
Ulcet okt hiv
Ulcet okt hivUlcet okt hiv
Ulcet okt hiv
 
Nouveau Titanic
Nouveau TitanicNouveau Titanic
Nouveau Titanic
 
Sicilia
SiciliaSicilia
Sicilia
 
Etica
EticaEtica
Etica
 
Agropecuria
AgropecuriaAgropecuria
Agropecuria
 
Graduarme en la escuela
Graduarme en la escuelaGraduarme en la escuela
Graduarme en la escuela
 
Ghandi - Paz
Ghandi - PazGhandi - Paz
Ghandi - Paz
 
The entertainer-level-five
The entertainer-level-fiveThe entertainer-level-five
The entertainer-level-five
 
Dubai yacht charter
Dubai yacht charterDubai yacht charter
Dubai yacht charter
 
Choices nutri lean-presenter_slides
Choices nutri lean-presenter_slidesChoices nutri lean-presenter_slides
Choices nutri lean-presenter_slides
 
Ambato de tierra de flotres y fruta
Ambato de tierra de flotres y frutaAmbato de tierra de flotres y fruta
Ambato de tierra de flotres y fruta
 
Sosutattoo
SosutattooSosutattoo
Sosutattoo
 
As 12 maiores cidades do mundo
As 12 maiores cidades do mundoAs 12 maiores cidades do mundo
As 12 maiores cidades do mundo
 
Automation
Automation Automation
Automation
 
Eternidade
EternidadeEternidade
Eternidade
 
Combustión
CombustiónCombustión
Combustión
 

Similar to 第06章 树和二叉树(java版)

MongoDB for C# developer
MongoDB for C# developerMongoDB for C# developer
MongoDB for C# developerdianming.song
 
Clojure概览
Clojure概览Clojure概览
Clojure概览
dennis zhuang
 
第07章 图(java版)
第07章  图(java版)第07章  图(java版)
第07章 图(java版)Yan Li
 
第05章 数组和广义表(java版)
第05章  数组和广义表(java版)第05章  数组和广义表(java版)
第05章 数组和广义表(java版)Yan Li
 
第04章 栈和队列(java版)
第04章  栈和队列(java版)第04章  栈和队列(java版)
第04章 栈和队列(java版)Yan Li
 
Cassandra简介.ppt
Cassandra简介.pptCassandra简介.ppt
Cassandra简介.pptjames tong
 
Cassandra的初步使用及一些简单的操作
Cassandra的初步使用及一些简单的操作Cassandra的初步使用及一些简单的操作
Cassandra的初步使用及一些简单的操作
zhubin885
 
Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研lorisjand
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學
Bo-Yi Wu
 
Android混淆技巧与反混淆 小波
Android混淆技巧与反混淆 小波Android混淆技巧与反混淆 小波
Android混淆技巧与反混淆 小波
正炎 高
 
lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫
建興 王
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
Chong-Kuan Chen
 
前端基础知识回顾
前端基础知识回顾前端基础知识回顾
前端基础知识回顾Wu tianhao
 
Hibernate教程
Hibernate教程Hibernate教程
Hibernate教程
Shilong Sang
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)Yan Li
 
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese Version
Frank S.C. Tseng
 
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renrend0nn9n
 

Similar to 第06章 树和二叉树(java版) (20)

Jvm内存管理基础
Jvm内存管理基础Jvm内存管理基础
Jvm内存管理基础
 
MongoDB for C# developer
MongoDB for C# developerMongoDB for C# developer
MongoDB for C# developer
 
Clojure概览
Clojure概览Clojure概览
Clojure概览
 
第07章 图(java版)
第07章  图(java版)第07章  图(java版)
第07章 图(java版)
 
第05章 数组和广义表(java版)
第05章  数组和广义表(java版)第05章  数组和广义表(java版)
第05章 数组和广义表(java版)
 
第04章 栈和队列(java版)
第04章  栈和队列(java版)第04章  栈和队列(java版)
第04章 栈和队列(java版)
 
Cassandra简介.ppt
Cassandra简介.pptCassandra简介.ppt
Cassandra简介.ppt
 
Cassandra的初步使用及一些简单的操作
Cassandra的初步使用及一些简单的操作Cassandra的初步使用及一些简单的操作
Cassandra的初步使用及一些简单的操作
 
Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學
 
Sun java
Sun javaSun java
Sun java
 
Android混淆技巧与反混淆 小波
Android混淆技巧与反混淆 小波Android混淆技巧与反混淆 小波
Android混淆技巧与反混淆 小波
 
lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
 
前端基础知识回顾
前端基础知识回顾前端基础知识回顾
前端基础知识回顾
 
Hibernate教程
Hibernate教程Hibernate教程
Hibernate教程
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)
 
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese Version
 
中软
中软中软
中软
 
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renren
 

More from Yan Li

Chapter 01 essentials final
Chapter 01 essentials finalChapter 01 essentials final
Chapter 01 essentials final
Yan Li
 
Chapter 05 essentials final
Chapter 05 essentials finalChapter 05 essentials final
Chapter 05 essentials final
Yan Li
 
Chapter 04 essentials final
Chapter 04 essentials finalChapter 04 essentials final
Chapter 04 essentials final
Yan Li
 
Chapter 02 essentials final
Chapter 02 essentials finalChapter 02 essentials final
Chapter 02 essentials final
Yan Li
 
Chapter 03 essentials final
Chapter 03 essentials finalChapter 03 essentials final
Chapter 03 essentials final
Yan Li
 
Introduction to om
Introduction to omIntroduction to om
Introduction to om
Yan Li
 
第10章 综合应用设计(java版)
第10章  综合应用设计(java版)第10章  综合应用设计(java版)
第10章 综合应用设计(java版)Yan Li
 
第09章 排序(java版)
第09章  排序(java版)第09章  排序(java版)
第09章 排序(java版)Yan Li
 
第03章 串(java版)
第03章  串(java版)第03章  串(java版)
第03章 串(java版)Yan Li
 

More from Yan Li (9)

Chapter 01 essentials final
Chapter 01 essentials finalChapter 01 essentials final
Chapter 01 essentials final
 
Chapter 05 essentials final
Chapter 05 essentials finalChapter 05 essentials final
Chapter 05 essentials final
 
Chapter 04 essentials final
Chapter 04 essentials finalChapter 04 essentials final
Chapter 04 essentials final
 
Chapter 02 essentials final
Chapter 02 essentials finalChapter 02 essentials final
Chapter 02 essentials final
 
Chapter 03 essentials final
Chapter 03 essentials finalChapter 03 essentials final
Chapter 03 essentials final
 
Introduction to om
Introduction to omIntroduction to om
Introduction to om
 
第10章 综合应用设计(java版)
第10章  综合应用设计(java版)第10章  综合应用设计(java版)
第10章 综合应用设计(java版)
 
第09章 排序(java版)
第09章  排序(java版)第09章  排序(java版)
第09章 排序(java版)
 
第03章 串(java版)
第03章  串(java版)第03章  串(java版)
第03章 串(java版)
 

第06章 树和二叉树(java版)

  • 1. 第 6 章 树和二叉树 6.1 树及其抽象数据类型 6.2 二叉树及其抽象数据类型 6.3 二叉树的表示和实现 6.4 线索二叉树 6.5 Huffman编码与Huffman树 6.6 树的表示和实现 本章是数据结构课程的重中之重,也是难 点所在,表现为二叉链表存储结构和递归算 法相结合。链式存储结构和递归算法本身就 是两个难 点,建立二叉树需要将它们
  • 2. 目的和要求  目的:理解树型结构;掌握链式存储结构表达 非线性结构,掌握递归算法设计。 • 内容:二叉树的定义、性质、存储结构,二叉 链 表表示的二叉树类;中序线索二叉树; Huffman 树;树的定义、存储结构和实现。 • 要求:理解树和二叉树概念,掌握树和二叉树 的 表示和实现,掌握递归算法设计。 • 重点:二叉链表表示的二叉树类; Huffman 树 ;树 的定义、存储结构和构造算法。 • 难点:链式存储结构表达非线性结构;递归算 法 设计。 • 实验:树和二叉树的基本操作,链式存储 结 构表示树和二叉树;递归算法。
  • 3. 《数据结构( Java 版)(第 3 版)》 6.1 树及其抽象数据类型 6.1.1 树定义 6.1.2 树的术 语 6.1.3 树的表示法 6.1.4 树抽象数 据类型
  • 4. 《数据结构( Java 版)(第 3 版)》 6.1.1 树定义 树( tree )是由 n ( n≥0 )个结点组 成的有限集合。 n=0 的树称为空树; n>0 的树 T : 根( root )结点,它没有前驱结点。 其他结点分为 m 棵互不相交的子树。
  • 5. 《数据结构( Java 版)(第 3 版)》 6.1.2 树的术语 1. 父母、孩子与兄弟结点 2. 度 3. 结点层次、树的高度 4. 边、路径 5. 无序树、有序树 6. 森林
  • 6. 《数据结构( Java 版)(第 3 版)》 6.1.3 树的表示法 1. 图示法 2. 横向凹入表示法 A B E F C G D H I J 3. 广义表表示 A(B(E, F), C(G), D(H, I, J))
  • 7. 《数据结构( Java 版)(第 3 版)》 6.1.4 树抽象数据类 型 public interface TTree<T> // 树接口 { boolean isEmpty(); // 判断是否空树 TreeNode<T> getChild(TreeNode<T> p,int i);// 返回 p 第 i 个孩 子 TreeNode<T> getParent(TreeNode<T> node);// 返回 node 的父 母 int count(); // 树的结点个数 int height(); // 树的高度 TreeNode<T> search(T x); // 查找并返回元素为 x 的 结点 void preOrder(); // 先根次序遍历树 void postOrder(); // 后根次序遍历树 void levelOrder(); // 按层次遍历树 void insertRoot(T x); // 插入元素 x 作为根结
  • 8. 《数据结构( Java 版)(第 3 版)》 6.2 二叉树及其抽象数据类型 6.2.1 二叉树定义 6.2.2 二叉树性质 6.2.3 二叉树的遍历 6.2.4 二叉树抽象数据类型
  • 9. 《数据结构( Java 版)(第 3 版)》 6.2.1 二叉树定义 二叉树( binary tree )是 n 个结点的有限 集合:  空二叉树;  由一个根结点、两棵互不相交的左子树和 右子树组成。
  • 10. 《数据结构( Java 版)(第 3 版)》 6.2.2 二叉树性质 性质 1 :若根结点的层次为 1 ,则二叉树 第 i 层最多有 2i −1 ( i≥1 )个结点。 性质 2 :在高度为 k 的二叉树中,最多有 2k −1 个结点( k≥0 )。 性质 3 :设一棵二叉树的叶子结点数为 n0 , 2 度结点数为 n2 ,则 n0=n2+1 。
  • 11. 《数据结构( Java 版)(第 3 版)》 性质 4 : n 个结点完全二叉树的高度是 。 性质 5 :一棵具有 n 个结点的完全二叉树,对序号为 i ( 0≤i<n )的结点,有: a. 若 i=0 ,则 i 为根结点,无父母结点;若 i >0 ,则 i 的父 母结点序号为。 b. 若 2i+1<n ,则 i 的左孩子结点序号为 2i+1 ;否则 i 无 左孩子。 c. 若 2i+2<n ,则 i 的右孩子结点序号为 2i+2 ;否则 i 无   1log2 += nk
  • 12. 《数据结构( Java 版)(第 3 版)》 6.2.3 二叉树的遍历 先根次序:访问根结点,遍历左子树,遍历右子树 。 中根次序:遍历左子树,访问根结点,遍历右子树 。 后根次序:遍历左子树,遍历右子树,访问根结点 。
  • 13. 《数据结构( Java 版)(第 3 版)》 6.2.4 二叉树抽象数据类型 public interface BinaryTTree<T> { boolean isEmpty(); // 判断是否空 int count(); // 返回结点个数 int height(); // 返回高度 void preOrder(); // 先根次序遍历 void inOrder(); // 中根次序遍历 void postOrder(); // 后根次序遍历 void levelOrder(); // 按层次遍历 BinaryNode<T> search(T key); // 查找 BinaryNode<T> getParent(BinaryNode<T> node);// 返回父母 void insertRoot(T x); // 插入元素 x 作为根结点 BinaryNode<T> insertChild(BinaryNode<T> p, T x, boolean leftChild); void removeChild(BinaryNode<T> p, boolean leftChild); void removeAll(); }
  • 14. 《数据结构( Java 版)(第 3 版)》 6.3 二叉树的表示和实现 6.3.1 二叉树的存储结构 6.3.2 二叉树的二叉链表实现 6.3.3 三叉树的二叉链表实现
  • 15. 《数据结构( Java 版)(第 3 版)》 6.3.1 二叉树的存储结构 1. 二叉树的顺序存储结构
  • 16. 《数据结构( Java 版)(第 3 版)》 2. 二叉树的链式存储结构  二叉链表  三叉链表
  • 17. 《数据结构( Java 版)(第 3 版)》 6.3.2 二叉树的二叉链表实现 1. 二叉树的二叉链表结点类 public class BinaryNode<T> { T data; // 数据元素 BinaryNode<T> left, right; // 左、右孩子 } 2. 二叉树类 public class BinaryTree<T> implements BinaryTTree<T> { BinaryNode<T> root; // 根结点 }
  • 18. 《数据结构( Java 版)(第 3 版)》 3. 二叉树三种次序遍历的递归算 法 // 先根次序遍历以 p 结点为根的子树 private void preOrder(BinaryNode<T> p) { if (p!=null) // 若二叉树不空 { System.out.print(p.data+" "); // 访问当前 结点 preOrder(p.left); // 按先根次序遍历左子树 preOrder(p.right); // 按先根次序遍历右子树 } }
  • 19. 《数据结构( Java 版)(第 3 版)》 4. 基于遍历的操作 a. 求结点个数 b. 求高度 c. 查找 d. 获得父母结点
  • 20. 《数据结构( Java 版)(第 3 版)》 5. 构造二叉树 ( 1 )先根和中根序列表示
  • 21. 《数据结构( Java 版)(第 3 版)》 ( 2 )标明空子树的先根序列 表示 【例 6.2 】 输出二叉树中指定结点的所有祖先结 点。
  • 22. 《数据结构( Java 版)(第 3 版)》 ( 3 )广义表表示
  • 23. 《数据结构( Java 版)(第 3 版)》 ( 4 )以完全二叉树的层次遍历 序列构造链式存储结构的完全二 叉树 【例 6.3 】 建立二叉链表表示的完全二叉树 。
  • 24. 《数据结构( Java 版)(第 3 版)》 6. 二叉树的插入和删除操 作 ( 1 )插入一个结点 ( 2 )删除一棵子树
  • 25. 《数据结构( Java 版)(第 3 版)》 7. 二叉 树遍历的 非递归算 法
  • 26. 《数据结构( Java 版)(第 3 版)》 8. 二叉树的层次遍历
  • 27. 《数据结构( Java 版)(第 3 版)》 6.3.3 三叉树的二叉链表 实现 1. 二叉树的三叉链表结点类 public class TriNode<T> { public T data; // 数据 域 public TriNode<T> parent, left, right; // 父母结 点、左和右孩子结点
  • 28. 《数据结构( Java 版)(第 3 版)》 2. 三叉链表表示的二叉树类 public class TriBinaryTree<T> { public TriNode<T> root; // 根结 点 } ( 1 )构造二叉树
  • 29. 《数据结构( Java 版)(第 3 版)》 ( 2 )插入结点 例 6.4 输出三叉链表存储二叉树的一条直 径。
  • 30. 《数据结构( Java 版)(第 3 版)》 6.4 线索二叉树 6.4.1 线索二叉树定义 0 leftÖ¸Ïò ×óº¢×Ó ltag 1 left Ϊ Ï ßË÷ £¬ Ö¸Ïò Ç°Çý½áµãC  =   0 right rtag 1 right Ϊ Ï ßË÷ £¬ Ö¸Ïò ºó ¼Ì½áµãC  =  
  • 31. 《数据结构( Java 版)(第 3 版)》 6.4.2 中序线索二叉树 1. 二叉树的中序线索化 2. 中序线索二叉树类 3. 中根次序遍历中序线索二叉树 【例 6.5 】 构造中序线索二叉树并进行中根次 序遍历。 4. 先根次序遍历中序线索二叉树 5. 后根次序遍历中序线索二叉树
  • 32. 《数据结构( Java 版)(第 3 版)》 1. 二 叉树 的中 序线 索化
  • 33. 《数据结构( Java 版)(第 3 版)》 2. 中序线索二叉树类 public class ThreadBinaryTree<T> { public ThreadNode<T> root; } 3. 中根次序遍历中序线索二叉树
  • 34. 《数据结构( Java 版)(第 3 版)》 4. 先根次序遍历中序线索二叉 树
  • 35. 《数据结构( Java 版)(第 3 版)》 5. 后根次序遍历中序线索二叉 树
  • 36. 《数据结构( Java 版)(第 3 版)》 6.5 Huffman 编码与 Huffman 树 6.5.1 Huffman 编码 存储“ AAAABBBCDDBBAAA” ,字符集 [A 、 B 、 D 、 C] ,字符出现次数为 7 、 5 、 2 、 1 ,频率为 0.47 、 0.33 、 0.13 、 0.07 ,哈夫曼编码过程为: A A A A B B B C D D B B A A A 0 0 0 0 10 10 10 111 110 110 10 10 0 0 0
  • 37. 《数据结构( Java 版)(第 3 版)》 6.5.2 Huffman 树 1. 二叉树的路径长度 ∑ − = = 1 0 PL n i il
  • 38. 《数据结构( Java 版)(第 3 版)》 2. 二叉树的外路径长度
  • 39. 《数据结构( Java 版)(第 3 版)》 3. 二叉树的带权外路径长度 1 0 WPL ( ) n i i i w l − = = ×∑
  • 40. 《数据结构( Java 版)(第 3 版)》 4. Huffman 算法 哈夫曼树定义为带权外路径长度最短的二叉 树。 哈夫曼树不唯一
  • 41. 《数据结构( Java 版)(第 3 版)》 构造 Huffman 树并获得 Huffman 编码 5. Huffman 编码的译码
  • 42. 《数据结构( Java 版)(第 3 版)》 例 6.6 构造 Huffman 树并获得 Huffman 编码。<1> 采用静态三叉链表存储 Huffman 树
  • 43. 《数据结构( Java 版)(第 3 版)》 图 6-44 Huffman 树和 Huffman 编码 若权值集合 {5,29,7,8,14,23,3,11} 对应字 符 A ~ H
  • 44. 《数据结构( Java 版)(第 3 版)》 <2> 存储 Huffman 编码
  • 45. 《数据结构( Java 版)(第 3 版)》 6.6 树的表示和实现 6.6.1 树的遍历 6.6.2 树的存储结构 6.3.3 树的孩子兄弟链表实现
  • 46. 《数据结构( Java 版)(第 3 版)》 6.6.1 树的遍历 1. 树的先根遍历算法描述如下: a. 访问根结点。 b. 按照从左到右的次序先根遍历根的每一棵子 树。 2. 树的后根遍历算法描述如下: a. 按照从左到右的次序后根遍历根的每一棵子 树。 b. 访问根结点。
  • 47. 《数据结构( Java 版)(第 3 版)》 6.6.2 树的存储结构 1. 孩子 链表 2. 孩子 兄弟 链表
  • 48. 《数据结构( Java 版)(第 3 版)》 6.3.3 树的孩子兄弟链表 实现 1. 树的孩子兄弟链表结点类 public class TreeNode<T> { public T data; // 数据域 public TreeNode<T> child, sibling; // 孩子、兄弟结点 }
  • 49. 《数据结构( Java 版)(第 3 版)》 2. 树类声明 public class Tree<T> implements TTree<T> { public TreeNode<T> root; // 根结 点 } 3. 树的遍历 4. 返回结点 a. 返回最后一个兄弟结点
  • 50. 《数据结构( Java 版)(第 3 版)》 5. 插入结点 1. 插入根结点 2. 插入兄弟结点
  • 51. 《数据结构( Java 版)(第 3 版)》 6. 以横向凹入表示构造树或森 林 例 6.8 以树的横向凹入表示构造树或森林。
  • 52. 《数据结构( Java 版)(第 3 版)》 7. 树的广义表表示 例 6.9 树的广义表表示及构造。 中国 ( 北京 , 上海 , 江苏 ( 南京 , 苏州 , 无锡 ), 浙江 ( 杭州 , 宁波 , 温州 ), 广 东 ( 广州 )), 韩国 ( 首尔 ), 美国 ( 华 盛顿 )