狠狠撸

狠狠撸Share 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

第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 树的广义表表示及构造。 中国 ( 北京 , 上海 , 江苏 ( 南京 , 苏州 , 无锡 ), 浙江 ( 杭州 , 宁波 , 温州 ), 广 东 ( 广州 )), 韩国 ( 首尔 ), 美国 ( 华 盛顿 )