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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

6.1 树及其抽象数据类型 6.2 二叉树 6.3 线索二叉树 6.4 Huffman树 6.5 树的表示和实现 课程的重中之重,也是难点所在。 目的:理解树结构。 要求:掌握二叉树、树的表示和实现。 重点:二叉树实现,Huffman树,树。 难点:二叉链表存储结构,递归算法。
(b)创建Y结点作为parent的右孩子, parent的原右孩子F作为Y结点的右孩子
《数据结构(Java版)(第4版)》第6章 23
4. 二叉树删除子树
//删除parent结点的左/右子树 public void remove(BinaryNode<T> parent, boolean leftChild)
《数据结构(Java版)(第4版)》第6章 22
3. 二叉树插入结点
BinaryNode<T> insert(T x) //插入根结点 BinaryNode<T> insert(BinaryNode<T> parent, T x, boolean leftChild) //插入x为parent结点的左/右孩子
《数据结构(Java版)(第4版)》第6章 3
6.1.2 树的术语
1. 父母、孩子与兄弟结点 4. 边、路径 2. 度 5. 无序树、有序树 3. 结点层次、树的高度 6. 森林
《数据结构(Java版)(第4版)》第6章 4
6.1.3 树抽象数据类型
ADT Tree<T> { boolean isEmpty() int level(T key) int size() int height() void preorder() void postorder() void levelorder() //树抽象数据类型
B
D
H
(b)完全二叉树的顺序存储结构
《数据结构(Java版)(第4版)》第6章 19
2. 二叉树的链式存储结构
left A
左孩子 数据 右孩子 data right A
(1)二叉链表
B C E G H F
根指针 root B ∧ ∧ D ∧ G ∧
C ∧ E ∧ ∧ H ∧ F ∧
(2)三叉链表
D
6.2.1 二叉树定义
二叉树(binary tree)是n个结点的有限集合: 空二叉树; 由一个根结点、两棵互不相交的左子树和右 子树组成。
《数据结构(Java版)(第4版)》第6章 8
【思考题6-1】① 二叉树与树的差别
二叉树是不是度为2的树?二叉树是不是 度为2的有序树?为什么? 2个结点的树和二叉树的基本形态
《数据结构(Java版)(第4版)》第6章 9
【思考题6-1】②
画出3个结点的树和二叉树的基本形态。
(a)3个结点的树有2种形态
(b)3个结点的二叉树有5种形态
《数据结构(Java版)(第4版)》第6章 10
6.2.2 二叉树性质
性质1:若根结点的层次为1,则二叉树第i层最 多有2i1(i≥1)个结点。 性质2:在高度为h的二叉树中,最多有2h1个 结点(h≥0)。 性质3:设一棵二叉树的叶子结点数为n0,2度 结点数为n2,则n0=n2+1。
3. 二叉树的先根、 中根和后根次 序遍历算法
《数据结构(Java版)(第4版)》第6章 14
2. 兄弟优先的遍历规则
层次遍历序列: ABCDEFGH
《数据结构(Java版)(第4版)》第6章 15
习6-16(a)
给出二叉树的先根、中根、后根和层次遍历 序列。 A
B D 来自百度文库 E J F K
《数据结构(Java版)(第4版)》第6章 16
1. 孩子优先的遍历规则
先根次序:访问根结点,遍历左子树,遍历右子树。 中根次序:遍历左子树,访问根结点,遍历右子树。 后根次序:遍历左子树,遍历右子树,访问根结点。
先根遍历序列:A B D G C E F H 中根遍历序列:D G B A E C H F 后根遍历序列:G D B E H F C A
《数据结构(Java版)(第4版)》第6章 25
(2)先根、中根、后根次序遍 历二叉树,递归算法
String toString() //先根次序遍历 String toString(BinaryNode<T> p)//递归 void inorder() //中根次序遍历序列 void inorder(BinaryNode<T> p) //递归 void postorder() //后根次序遍历序列 void postorder(BinaryNode<T> p) //递归
《数据结构(Java版)(第4版)》第6章 26
【思考题6-2】基于遍历的操作
根据不同的应用需求,采用不同次序遍历。习题解答 int size() //结点数 int height() //高度 【实验题6-2】 void leaf() //输出叶子结点 int countLeaf() //叶子结点数 BinaryNode<T> search(T key) //查找 BinaryNode<T> parent(BinaryNode<T> node) //返回父母结点 void replaceAll(T key, T x) //全部替换
C G
H
6.2.4 二叉树抽象数据类型
ADT BinaryTree<T> { boolean isEmpty() int size() int height() void preorder() void inorder() void postorder() void levelorder()
//判空 //结点数 //高度 //先根次序遍历 //中根次序遍历 //后根次序遍历 //按层次遍历
left data right root parent B X ∧ ∧ D ∧ G ∧ (a)创建X结点作为parent的左孩子, parent的原左孩子D作为X结点的左孩子 ∧ D ∧ G ∧ ∧ H ∧ X ∧ A root B ∧ ∧ E ∧ left data right A C ∧ Y F ∧ parent
}
《数据结构(Java版)(第4版)》第6章 18
6.2.5 二叉树的存储结构
1. 二叉树的顺序存储结构
二叉树的性质5 0 1 3 7 A C E 4 5 F 2 6 0 1 2 3 G 4 5 6 n- 1 (a)一棵完全二叉树 A B C D E F G H 2*i+1<n,左孩子 2*i+2<n,右孩子 i (i-1)/2,父母
//判空 //层次 //结点数 //高度 //先根次序遍历 //后根次序遍历 //层次遍历
《数据结构(Java版)(第4版)》第6章 5
ADT Tree<T>
TreeNode<T> insert(T x) //插入元素x作为根 TreeNode<T> insert(TreeNode<T> p, T x, int i) //插入x作为p结点的第i(≥0)个孩子 void remove(TreeNode<T> p, int i) //删除子树 void clear() //删除所有结点 TreeNode<T> search(T key) boolean contains(T key) T remove(T key)
}
//描述字符串 //判叶子结点
《数据结构(Java版)(第4版)》第6章 21
2. 二叉树类
public class BinaryTree<T>
{
BinaryNode<T> root;
//根结点
public BinaryTree() //构造空树 public boolean isEmpty() //判空 }
《数据结构(Java版)(第4版)》第6章 1
第 6章
树和二叉树

6.1 树及其抽象数据类型
《数据结构(Java版)(第4版)》第6章 2
6.1.1 树定义
B E F
A C G H D I J
树(tree)是由n(n≥0)个结点组成的有限集合。 n=0的树称为空树;n>0的树T: 根(root)结点,它没有前驱结点。 其他结点分为m棵互不相交的子树。
《数据结构(Java版)(第4版)》第6章 11
完全二叉树
性质4:一棵具有n个结点的 2 完全二叉树,其高度为 性质5:一棵具有n个结点的完全二叉树,对序号为i (0≤i<n)的结点,有:
h log n 1
① 若i=0,则i为根结点,无父母结点; 若i>0,则i的父母结点序号为 (i 1) / 2 ② 若2i+1<n,则i的左孩子结点在2i+1;否则i无左孩子。 ③ 若2i+2<n,则i的右孩子结点在2i+2;否则i无右孩子。
《数据结构(Java版)(第4版)》第6章 17
ADT BinaryTree<T>
BinaryNode<T> insert(T x) //插入根 BinaryNode<T> insert(BinaryNode<T> p, T x, boolean leftChild) //插入孩子 void remove(BinaryNode<T> parent, boolean leftChild) //删除子树 void clear() //删除所有结点 BinaryNode<T> search(T key) //查找 boolean contains(T key) //包含 int level(T key) //key结点所在层次
public void clear() //删除所有结点
《数据结构(Java版)(第4版)》第6章 24
5. 二叉树孩子优先的遍历算法
(1)先根次序遍历二叉树算法描述 public void preorder() //输出先根次序遍历序列 { preorder(this.root); //遍历以root结点为根的二叉树 } //先根次序遍历以p结点为根的子树,递归方法 private void preorder(BinaryNode<T> p) { if (p!=null) //若二叉树不空 { System.out.print(p.data.toString()+" "); //先访问 preorder(p.left); //遍历p的左子树,递归调用 preorder(p.right); //遍历p的右子树,递归调用 } }
}
《数据结构(Java版)(第4版)》第6章 6
//查找 //包含 //删除子树
6.2 二叉树
6.2.1 二叉树定义 6.2.2 二叉树性质 6.2.3 二叉树的遍历 6.2.4 二叉树抽象数据类型 6.2.5 二叉树的存储结构 6.2.6 二叉树的二叉链表实现
《数据结构(Java版)(第4版)》第6章 7
(a)一棵二叉树
左孩子 数据 父母 右孩子 left 根指针 root data parent right A ∧ ∧ 0 1 2 B ∧ D ∧ G ∧ (a)三叉链表 C ∧ E ∧ F ∧ ∧ 3 4 5 6 ∧ H 7
(b)二叉链表
data parent left right A B C D E F G H -1 0 0 1 2 2 3 5 1 3 4 -1 -1 7 -1 -1 2 -1 5 6 -1 -1 -1 -1
(b)静态三叉链表 《数据结构(Java版)(第4版)》第6章 20
6.2.6 二叉树的二叉链表实现
1.
{
二叉树的二叉链表结点类
public class BinaryNode<T>
T data;
//数据元素
BinaryNode<T> left, right; //左、右孩子
public BinaryNode(T data, BinaryNode<T> left, BinaryNode<T> right) //构造结点 public BinaryNode(T data) //构造叶子 public String toString() public boolean isLeaf()
【实验题6-3】完全二叉树类
《数据结构(Java版)(第4版)》第6章 12
6.2.3 二叉树的遍历规则
1. 孩子优先的遍历规则 所有遍历序列有6种: ABC,BAC,BCA, //先左孩子 CBA,CAB,ACB。 //先右孩子 约定遍历子树的次序是先左子树后右子树
《数据结构(Java版)(第4版)》第6章 13
相关文档
最新文档