Download Binary Trees

Document related concepts

Java ConcurrentMap wikipedia , lookup

Lattice model (finance) wikipedia , lookup

B-tree wikipedia , lookup

Quadtree wikipedia , lookup

Red–black tree wikipedia , lookup

Interval tree wikipedia , lookup

Binary tree wikipedia , lookup

Binary search tree wikipedia , lookup

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
Discover how to insert and delete items in a binary
search tree
Java Programming: Program Design Including Data Structures
2
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
3
Binary Trees (continued)
Figure 19-1 Binary tree
Java Programming: Program Design Including Data Structures
4
Binary Trees (continued)
Figure 19-6 Various binary trees with three nodes
Java Programming: Program Design Including Data Structures
5
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
6
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
7
Binary Trees (continued)
Figure 19-8 Binary tree
Java Programming: Program Design Including Data Structures
8
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
9
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
10
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
11
Copy 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
12
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
13
Inorder Traversal
 Binary tree is traversed as follows:
 Traverse left subtree
 Visit node
 Traverse right subtree
Java Programming: Program Design Including Data Structures
14
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
15
Preorder Traversal
 Binary tree is traversed as follows:
 Visit node
 Traverse left subtree
 Traverse right subtree
Java Programming: Program Design Including Data Structures
16
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
17
Postorder Traversal
 Binary tree is traversed as follows:
 Traverse left subtree
 Traverse right subtree
 Visit node
Java Programming: Program Design Including Data Structures
18
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
19
Implementing Binary Trees
Figure 19-11 UML class diagram of the interface BinaryTreeADT
Java Programming: Program Design Including Data Structures
20
Implementing Binary Trees
(continued)
Figure 19-12 UML class diagram of the class BinaryTree
Java Programming: Program Design Including Data Structures
21
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
22
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
23
Binary Search Trees (continued)
Figure 19-14 Binary search tree
Java Programming: Program Design Including Data Structures
24
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
25
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
26
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
27
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
28
Delete (continued)
 Delete operation has four cases




Case 1: Node to be deleted is a leaf
Case 2: Node to be deleted has no left subtree
Case 3: Node to be deleted has no right subtree
Case 4: Node to be deleted has nonempty left and
right subtrees  search left subtree of the node to be
deleted to find its immediate predecessor
Java Programming: Program Design Including Data Structures
29
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
30
Nonrecursive Binary Tree
Traversal Algorithms
 Traversal algorithms
 Inorder
 Preorder
 Postorder
Java Programming: Program Design Including Data Structures
31
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
32
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
33
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
34
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
35
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
36
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
37
AVL (Height-Balanced)
Trees(continued)
Figure 19-24 Perfectly balanced binary tree
Java Programming: Program Design Including Data Structures
38
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
39
AVL (Height-Balanced) Trees
(continued)
Figure 19-25 Perfectly balanced binary tree
Java Programming: Program Design Including Data Structures
40
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
41
Insertion into AVL Trees
(continued)
Figure 19-27 AVL tree before inserting 90
Java Programming: Program Design Including Data Structures
42
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
43
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
44
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
45
AVL Tree Rotations (continued)
Figure 19-39 Left rotation at a
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)
 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
48
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
49
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
50
AVL Tree Rotations (continued)
Figure 19-46 AVL tree after inserting 20
Java Programming: Program Design Including Data Structures
51
AVL Tree Rotations (continued)
Figure 19-46 AVL tree after inserting 25
Java Programming: Program Design Including Data Structures
52
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
53
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
54
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
55
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
56
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
57