* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download ch19
Survey
Document related concepts
Transcript
Chapter 19: Binary Trees
Java Programming:
Program Design Including Data Structures
Chapter Objectives
Learn about binary trees
Explore various binary tree traversal algorithms
Learn how to organize data in a binary search tree
Java Programming: Program Design Including Data Structures
2
Chapter Objectives (continued)
Discover how to insert and delete items in a binary
search tree
Explore nonrecursive binary tree traversal algorithms
Learn about AVL (height-balanced) trees
Java Programming: Program Design Including Data Structures
3
Binary Trees
A binary tree, T, is either empty or
T has a special node called the root node
T has two sets of nodes, LT and RT, called the left
subtree and right subtree
LT and RT are binary trees
A binary tree can be shown pictorially
Java Programming: Program Design Including Data Structures
4
Binary Trees (continued)
Figure 19-1 Binary tree
Java Programming: Program Design Including Data Structures
5
Binary Trees (continued)
Figure 19-6 Various binary trees with three nodes
Java Programming: Program Design Including Data Structures
6
Binary Trees (continued)
You can write a class that represents each node in a
binary tree
Called BinaryTreeNode
Instance variables of the class BinaryTreeNode
info: stores the information part of the node
lLink: points to the root node of the left subtree
rLink: points to the root node of the right subtree
Java Programming: Program Design Including Data Structures
7
Binary Trees (continued)
Figure 19-7 UML class diagram of the class BinaryTreeNode and the
outer-inner class relationship
Java Programming: Program Design Including Data Structures
8
Binary Trees (continued)
Figure 19-8 Binary tree
Java Programming: Program Design Including Data Structures
9
Binary Trees (continued)
A leaf is a node in a tree with no children
Let U and V be two nodes in a binary tree
U is called the parent of V if there is a branch from U
to V
A path from a node X to a node Y is a sequence of
nodes X0, X1, ..., Xn such that:
X = X0,Xn = Y
Xi-1 is the parent of Xi for all i = 1, 2, ..., n
Java Programming: Program Design Including Data Structures
10
Binary Trees (continued)
Length of a path
The number of branches on that path
Level of a node
The number of branches on the path from the root to
the node
Height of a binary tree
The number of nodes on the longest path from the
root to a leaf
Java Programming: Program Design Including Data Structures
11
Binary Trees (continued)
Method height
private int height(BinaryTreeNode<T> p)
{
if (p == null)
return 0;
else
return 1 + Math.max(height(p.lLink), height(p.rLink));
}
Java Programming: Program Design Including Data Structures
12
Clone Tree
Method copyTree
private BinaryTreeNode<T> copyTree
(BinaryTreeNode<T> otherTreeRoot)
{
BinaryTreeNode<T> temp;
if (otherTreeRoot == null)
temp = null;
else
{
temp = (BinaryTreeNode<T>) otherTreeRoot.clone();
temp.lLink = copyTree(otherTreeRoot.lLink);
temp.rLink = copyTree(otherTreeRoot.rLink);
}
return temp;
}//end copyTree
Java Programming: Program Design Including Data Structures
13
Binary Tree Traversal
Item insertion, deletion, and lookup operations
require that the binary tree be traversed
Commonly used traversals
Inorder traversal
Preorder traversal
Postorder traversal
Java Programming: Program Design Including Data Structures
14
Inorder Traversal
Binary tree is traversed as follows:
Traverse left subtree
Visit node
Traverse right subtree
Java Programming: Program Design Including Data Structures
15
Inorder Traversal (continued)
Method inOrder
private void inorder(BinaryTreeNode<T> p)
{
if (p != null)
{
inorder(p.lLink);
System.out.print(p + “ “);
inorder(p.rLink);
}
}
Java Programming: Program Design Including Data Structures
16
Preorder Traversal
Binary tree is traversed as follows:
Visit node
Traverse left subtree
Traverse right subtree
Java Programming: Program Design Including Data Structures
17
Preorder Traversal (continued)
Method preOrder
private void preorder(BinaryTreeNode<T> p)
{
if (p != null)
{
System.out.print(p + “ “);
preorder(p.lLink);
preorder(p.rLink);
}
}
Java Programming: Program Design Including Data Structures
18
Postorder Traversal
Binary tree is traversed as follows:
Traverse left subtree
Traverse right subtree
Visit node
Java Programming: Program Design Including Data Structures
19
Postorder Traversal (continued)
Method postOrder
private void postorder(BinaryTreeNode<T> p)
{
if (p != null)
{
postorder(p.lLink);
postorder(p.rLink);
System.out.print(p + “ “);
}
}
Java Programming: Program Design Including Data Structures
20
Implementing Binary Trees
Figure 19-11 UML class diagram of the interface BinaryTreeADT
Java Programming: Program Design Including Data Structures
21
Implementing Binary Trees
(continued)
Figure 19-12 UML class diagram of the class BinaryTree
Java Programming: Program Design Including Data Structures
22
Implementing Binary Trees
(continued)
Method clone
public Object clone()
{
BinaryTree<T> copy = null;
try
{
copy = (BinaryTree<T>) super.clone();
}
catch (CloneNotSupportedException e)
{
return null;
}
if (root != null)
copy.root = copyTree(root);
return copy;
}
Java Programming: Program Design Including Data Structures
23
Binary Search Trees
To search for an item in a normal binary tree, you
must traverse entire tree until item is found
Search process will be very slow
Similar to searching in an arbitrary linked list
Binary search tree
Data in each node is
Larger than the data in its left child
Smaller than the data in its right child
Java Programming: Program Design Including Data Structures
24
Binary Search Trees (continued)
Figure 19-14 Binary search tree
Java Programming: Program Design Including Data Structures
25
Binary Search Trees (continued)
Figure 19-15 UML class diagram of the class BinarySearchTree
and the inheritance hierarchy
Java Programming: Program Design Including Data Structures
26
Search
Searches tree for a given item
General steps
Compare item with info in root node
If they are the same, stop the search
If item is smaller than info in root node
Follow link to left subtree
Otherwise
Follow link to right subtree
Java Programming: Program Design Including Data Structures
27
Insert
Inserts a new item into a binary search tree
General steps
Search tree and find the place where new item is to be
inserted
Search algorithm is similar to method search
Insert new item
Duplicate items are not allowed
Java Programming: Program Design Including Data Structures
28
Delete
Deletes item from a binary search tree
After deleting items, resulting tree must be a binary
search tree
General steps
Search the tree for the item to be deleted
Searching algorithm is similar to method search
Delete item
Java Programming: Program Design Including Data Structures
29
Delete (continued)
Delete operation has four cases
Node to be deleted is a leaf
Node to be deleted has no left subtree
Node to be deleted has no right subtree
Node to be deleted has nonempty left and right
subtrees
Java Programming: Program Design Including Data Structures
30
Binary Search Tree: Analysis
Performance depends on shape of the tree
If tree shape is linear, performance is the same as for
a linked list
Average number of nodes visited
1.39log2n = O(log2n)
Average number of key comparisons
2.77log2n = O(log2n)
Java Programming: Program Design Including Data Structures
31
Nonrecursive Binary Tree Traversal
Algorithms
Traversal algorithms
Inorder
Preorder
Postorder
Java Programming: Program Design Including Data Structures
32
Nonrecursive Inorder Traversal
Method nonRecursiveInTraversal
public void nonRecursiveInTraversal()
{
LinkedStackClass<BinaryTreeNode<T> > stack
= new LinkedStackClass<BinaryTreeNode<T> >();
BinaryTreeNode<T> current;
current = root;
while ((current != null) || (!stack.isEmptyStack()))
if (current != null)
{
stack.push(current);
current = current.lLink;
}
Java Programming: Program Design Including Data Structures
33
Nonrecursive Inorder Traversal
(continued)
else
{
current = (BinaryTreeNode<T>) stack.peek();
stack.pop();
System.out.print(current.info + “ “);
current = current.rLink;
}
System.out.println();
}
Java Programming: Program Design Including Data Structures
34
Nonrecursive Preorder Traversal
General algorithm
create stack
current = root;
while (current is not null or stack is nonempty)
if (current is not null)
{
visit current;
push current onto stack;
current = current.lLink;
}
else
{
pop stack into current;
current = current.rLink; //prepare to visit right subtree
}
Java Programming: Program Design Including Data Structures
35
Nonrecursive Postorder Traversal
General algorithm
Mark left subtree of node as visited
Visit left subtree and return to node
Mark right subtree of node as visited
Visit right subtree and return to node
Visit node
Java Programming: Program Design Including Data Structures
36
An Iterator to a Binary Tree
You can create an iterator for a binary tree
Iterator can traverse tree using
Inorder traversal
Preorder traversal
Postorder traversal
Java Programming: Program Design Including Data Structures
37
AVL (Height-Balanced) Trees
Search performance depends on shape of the tree
You want the tree to be balanced
AVL (height-balanced) tree
Resulting binary search tree is nearly balanced
Perfectly balanced binary search tree
Heights of the left and right subtrees are equal
Left and right subtrees are perfectly balanced binary
trees
Java Programming: Program Design Including Data Structures
38
AVL (Height-Balanced)
Trees(continued)
Figure 19-24 Perfectly balanced binary tree
Java Programming: Program Design Including Data Structures
39
AVL (Height-Balanced) Trees
(continued)
AVL tree: A binary search tree where
Heights of left and right subtrees differs by at most 1
Left and right subtrees are AVL trees
Balance factor
Difference between height of right subtree and height
of left subtree
Java Programming: Program Design Including Data Structures
40
AVL (Height-Balanced) Trees
(continued)
Figure 19-25 Perfectly balanced binary tree
Java Programming: Program Design Including Data Structures
41
Insertion into AVL Trees
General steps
Search AVL tree to find insertion point
Insert new item
Duplicate items are not allowed
Rebalance tree (if needed)
Java Programming: Program Design Including Data Structures
42
Insertion into AVL Trees
(continued)
Figure 19-27 AVL tree before inserting 90
Java Programming: Program Design Including Data Structures
43
Insertion into AVL Trees
(continued)
Figure 19-28 Binary search tree of Figure 19-27 after inserting 90; nodes other
than 90 show their balance factors before insertion
Java Programming: Program Design Including Data Structures
44
Insertion into AVL Trees
(continued)
Figure 19-29 AVL tree of Figure 19-27 after inserting 90 and adjusting the
balance factors
Java Programming: Program Design Including Data Structures
45
AVL Tree Rotations
Reconstruction procedure
Types of rotations
Left rotation
Nodes from right subtree move to left subtree
Root of right subtree becomes root of reconstructed
subtree
Right rotation
Nodes from left subtree move to right subtree
Root of left subtree becomes root of reconstructed
subtree
Java Programming: Program Design Including Data Structures
46
AVL Tree Rotations (continued)
Figure 19-39 Right rotation at b
Java Programming: Program Design Including Data Structures
47
AVL Tree Rotations (continued)
Figure 19-39 Left rotation at a
Java Programming: Program Design Including Data Structures
48
AVL Tree Rotations (continued)
Method rotateToLeft
private AVLNode<T> rotateToLeft(AVLNode<T> root)
{
AVLNode<T> p; //reference variable to the root of the right subtree of root
if (root == null)
System.err.println(“Error in the tree.”);
else
if (root.rLink == null)
System.err.println(“Error in the tree: “
+ “No right subtree to rotate.”);
else
{
p = root.rLink;
root.rLink = p.lLink; //the left subtree of p becomes the right
//subtree of root
p.lLink = root;
root = p;
//make p the new root node
}
return root;
}//end rotateToLeft
Java Programming: Program Design Including Data Structures
49
AVL Tree Rotations (continued)
Method rotateToRight
private AVLNode<T> rotateToRight(AVLNode<T> root)
{
AVLNode<T> p; //reference variable to the root of the
//left subtree of root
if (root == null)
System.err.println(“Error in the tree.”);
else
if (root.lLink == null)
System.err.println(“Error in the tree: “
+ “No left subtree to rotate.”);
else
{
p = root.lLink;
root.lLink = p.rLink; //the right subtree of p
//becomes the left subtree of root
p.rLink = root;
root = p;
//make p the new root node
}
return root;
}//end rotateToRight
Java Programming: Program Design Including Data Structures
50
AVL Tree Rotations (continued)
Figure 19-44 AVL tree after inserting 40
Figure 19-45 AVL tree after inserting 30
Java Programming: Program Design Including Data Structures
51
AVL Tree Rotations (continued)
Figure 19-46 AVL tree after inserting 20
Java Programming: Program Design Including Data Structures
52
AVL Tree Rotations (continued)
Figure 19-46 AVL tree after inserting 25
Java Programming: Program Design Including Data Structures
53
Deletion from AVL Trees
General steps
Find node to be deleted
Delete node
Four cases arise:
Node to be deleted is a leaf
Node to be deleted has no right child
Node to be deleted has no left child
Node to be deleted has both children
Java Programming: Program Design Including Data Structures
54
Analysis: AVL Trees
Height of AVL tree with n nodes (worst case)
1.44log2n = O(log2n)
Time to manipulate an AVL tree in the worst case is
no more than 44% of optimum time
Average search time of an AVL tree is about 4%
more than the optimum
Java Programming: Program Design Including Data Structures
55
Programming Example: Video Store
(Revisited)
Program in Chapter 16 used a linked list to keep
track of video inventory
Search could be time consuming
Modify program to use a binary tree instead
Insertion and deletion in a binary search tree is faster
than in a linked list
Java Programming: Program Design Including Data Structures
56
Chapter Summary
Binary trees
Every node has only two children
Left subtree
Right subtree
Binary tree traversal
Inorder
Preorder
Postorder
Java Programming: Program Design Including Data Structures
57
Chapter Summary (continued)
Binary search trees
Each node is greater than elements in its left subtree
and less than elements in its right subtree
AVL (height-balanced) trees
Binary search tree
Heights of left and right subtrees differs by at most 1
Left and right subtrees of the root node are AVL trees
Java Programming: Program Design Including Data Structures
58