章节主题
-
二叉树及其应用
-
二叉搜索树
-
AVL树
-
优先级队列
Chapter Topics
-
Binary Trees and Their Applications
-
Binary Search Trees
-
AVLTrees
-
Priority Queues
二叉树及其应用(Binary Trees and Their Applications)
二叉树
-
二叉树就像一个链表,除了每个节点最多可以有两个后继。
-
二叉树中节点X的后继者称为X的子节点。
-
在二叉树中,每个节点最多只有一个前驱。 X的前身称为X的父节点。
-
二叉树中节点的子节点是左子节点或右子节点。
Binary Trees
-
A binary tree is like a linked list, except each node may have up to two successors.
-
A successor of a node X in a binary tree is called a child of X.
-
In a binary tree, each node has at most one predecessor. The predecessor of X is called the parent of X.
-
A child of a node in a binary tree is either a left child or a right child.
关于二叉树的事实
-
如果节点C是另一个节点P的子节点,则P称为C的父节点。
-
二叉树可能为空。
-
非空二叉树具有唯一没有父节点的节点。 此节点称为二叉树的根。
-
没有子节点的节点称为叶子。
Facts About Binary Trees
-
If a node C is a child of another node P, then P is called the parent of C.
-
A binary tree may be empty.
-
A nonempty binary tree has a unique node that has no parent. This node is called the root of the binary tree.
-
A node with no children is called a leaf.
二叉树
-
C是A的右子节点。
-
E是C的左子节点。
-
D和G是叶子。
-
A是根。
A Binary Tree
-
C is the right child of A.
-
E is the left child of C.
-
D and G are leaves.
-
A is the root.
节点的后代
设X是二叉树T中的节点。如果Y在从X到T的叶子的路径上,则节点Y是X的后代。
-
C的后代是E,F和G.
-
B的后代是D.
Descendants of a Node
Let X be a node in a binary tree T. A node Y is a descendant of X if Y is on the path from X to a leaf of T.
-
Descendants of C are E, F, and G.
-
Descendants of B is D.
子树
-
节点X的所有后代的集合形成二叉树,称为以X为根的T的子树。
-
如果R是T的根,则以R的左子节为根的子树称为T的左子树,以R为右子节的子树称为T的右子树。
Subtrees
-
The collection of all descendants of a node X forms a binary tree, called the subtree of T rooted at X.
-
If R is the root of T, then the subtree rooted at the left child of R is called the left subtree of T, and the subtree rooted at the right child of R is called the right subtree of T.
二叉树的应用
-
二叉树用于组织信息以支持快速搜索。
-
二进制树的推广在数据库系统中用于存储数据。
-
二叉树用于表示算术表达式。
Applications of Binary Trees
-
Binary trees are used to organize information to support fast search.
-
Generalizations of binary trees are used in database systems to store data.
-
Binary trees are used to represent arithmetic expressions.
ADT二叉树的实现
-
实现基于类似于链接列表中使用的Node类。
-
SeeTreeNode.java。
Implementation of ADT Binary Trees
-
Implementation is based on a Node class similar to what is used in linked lists.
-
SeeTreeNode.java.
表示二叉树
-
二叉树由对其根节点的引用表示。
节点根;
-
空二进制树用引用表示,其值为null。
Representing a Binary Tree
-
A binary tree is represented by a reference to its root node.
Node root;
-
An empty binary tree is represented with a reference whose value is null.
ADT二叉树:
ADT二叉树的基本操作
-
作为抽象数据类型,二叉树具有添加和删除节点和子树的操作。 通过使用这些基本操作,您可以构建任何二叉树。
-
其他操作在树的根目录中设置或检索数据,并确定树是否为空。
-
遍历操作访问二叉树中的每个节点,使用它或对其执行某些操作。 三个标准命令是前序,中序和后序。
The ADT Binary Tree:
Basic Operations of the ADT Binary Tree
-
As an abstract datatype, the binary tree has operations that add and remove nodes and subtrees. By using these basic operations, you can build any binary tree.
-
Other operations set or retrieve the data in the root of the tree and determine whether the tree is empty.
-
Traversal operations visit every node in a binary tree, do something with it or to it. Three standard orders are preorder, inorder, and postorder.
ADT二叉树:
ADT二叉树的基本操作
-
可用于特定ADT二叉树的操作取决于要实现的二叉树的类型
-
ADT二叉树的基本操作
The ADT Binary Tree:
Basic Operations of the ADT Binary Tree
-
The operations available for a particular ADT binary tree depend on the type of binary tree being implemented
-
Basic operations of the ADT binary tree
-
-
createBinaryTree()
-
createBinaryTree(rootItem)
-
makeEmpty()
-
isEmpty()
-
getRoot() throws TreeException
-
setRoot(rootItem) throws
-
UnsupportedOperationException
-
ADT二叉树的常规操作(附加操作)
-
General operations (additional operations) of the ADT binary tree
-
createBinaryTree (rootItem, leftTree, rightTree)
-
setRoot(newItem)
-
attachLeft(newItem) throws TreeException
-
attachRight(newItem) throws TreeException
-
attachLeftSubtree(leftTree) throws TreeException
-
attachRightSubtree(rightTree) throws TreeException
-
detachLeftSubtree() throws TreeException
-
detachRightSubtree() throws TreeException
-
-
二叉树的遍历
-
二叉树的遍历算法访问树中的每个节点
-
递归遍历算法
-
前序遍历
-
中序遍历
-
后序遍历
-
-
这些遍历中的每一个都只访问二叉树中的每个节点一次,执行相同的操作(O(1)),独立于n,遍历为O(n)
-
Traversals of a Binary Tree
-
A traversal algorithm for a binary tree visits each node in the tree
-
Recursive traversal algorithms
-
Preorder traversal
-
Inorder traversal
-
Postorder traversal
-
-
Each of these traversals visits every node in a binary tree exactly once, performs the same operation (O(1)),independently of n, and traversal is O(n)
-
前序遍历算法假设“访问节点”表示显示节点的数据项。
if(树不为空){
显示树根中的数据
以前序遍历(树根的左子树)
以前序遍历((树的根的右子树)
}
-
Preorder traversal algorithm Assumes that "visit a node" means to display the node's data item.
if (the tree is not empty) {
Display the data in the root of the tree
preorder(Left subtree of the tree 's root)
preorder(Right subtree of the tree 's root)
}
- 中序遍历算法
假设“访问节点”意味着显示节点的数据项。
if(树不为空){
中序(树根的左子树)
显示树根中的数据
中序(树根的右子树)
}
-
Inorder traversal algorithm
Assumes that "visit a node" means to display the node's data item.
if (the tree is not empty) {
Inorder(Left subtree of the tree 's root)
Display the data in the root of the tree
Inorder(Right subtree of the tree 's root)
}
- 后序遍历算法
假设“访问节点”意味着显示节点的数据项。
if(树不为空){
后序(树根的左子树)
后序(树根的右子树)
显示树根中的数据
}
-
Post-order traversal algorithm
Assumes that "visit a node" means to display the node's data item.
if (the tree is not empty) {
Postorder(Left subtree of the tree 's root)
Postorder(Right subtree of the tree 's root)
Display the data in the root of the tree
}
-
二叉树的可能表示
-
基于数组的表示
-
Java类用于在树中定义节点
-
使用树节点数组表示二叉树
-
每个树节点包含一个数据部分和两个索引(每个节点的子节点一个)
-
需要创建一个跟踪可用节点的空闲列表
-
-
Possible Representations of a Binary Tree
-
An array-based representation
-
A Java class is used to define a node in the tree
-
A binary tree is represented by using an array of tree nodes
-
Each tree node contains a data portion and two indexes (one for each of the node’s children)
-
Requires the creation of a free list which keeps track of available nodes
-
-
基于数组的完整树表示
-
如果二叉树已完成并仍保持完整
-
可以使用基于阵列的内存高效实现
-
-
-
An array-based representation of a complete tree
-
If the binary tree is complete and remains complete
-
A memory-efficient array-based implementation can be used
-
-
-
基于参考的表示
-
Java引用可用于链接树中的节点
-
-
A reference-based representation
-
Java references can be used to link the nodes in the tree
-
基于参考的ADT二叉树实现
-
为ADT二叉树提供基于引用的实现的类
-
TreeNode
-
表示二叉树中的节点
-
-
TreeException
-
异常类
-
-
BinaryTreeBasis
-
基本树操作的抽象类
-
-
BinaryTree
-
提供二叉树的常规操作
-
扩展BinaryTreeBasis
-
-
A Reference-Based Implementation of the ADT Binary Tree
-
Classes that provide a reference-based implementation for the ADT binary tree
-
TreeNode
-
Represents a node in a binary tree
-
-
TreeException
-
An exception class
-
-
BinaryTreeBasis
-
An abstract class of basic tree operation
-
-
BinaryTree
-
Provides the general operations of a binary tree
-
Extends BinaryTreeBasis
-
-
使用迭代器的树遍历
-
TreeIterator
-
实现Java Iterator接口
-
必须提供三种方法:next,hasNext和remove
-
未实现删除
-
删除节点取决于树的类型
-
BinaryTreeBasis没有删除节点的方法。
-
-
-
-
提供将迭代器设置为所需遍历类型的方法
-
使用队列来维护树中节点的当前遍历
Tree Traversals Using an Iterator
-
TreeIterator
-
Implements the Java Iterator interface
-
must provide three methods: next, hasNext, and remove
-
Not implement remove
-
Removal of a node depends on the type of tree
-
BinaryTreeBasis doesn’t have a method removing a node.
-
-
-
Provides methods to set the iterator to the type of traversal desired
-
Uses a queue to maintain the current traversal of the nodes in the tree
使用迭代器的树遍历
-
非递归遍历(可选)
-
迭代方法和显式堆栈可用于模拟从递归调用返回到中序的操作
-
Tree Traversals Using an Iterator
-
Nonrecursive traversal (optional)
-
-
An iterative method and an explicit stack can be used to mimic actions at a return from a recursive call to inorder
-