Post on 01-Jan-2016
description
1
Binary Trees andBinary Search Trees
Based on Dale & Co: Object-Oriented Data Structures using C++ (graphics)
2
A binary tree is a structure in which:
Each node can have at most two children, and in which a unique path exists from the root to every other node.
The two children of a node are called the left child and the right child, if they exist.
Binary Tree
3
A Binary Tree
Q
V
T
K S
A E
L
4
How many leaf nodes?
Q
V
T
K S
A E
L
5
How many descendants of Q?
Q
V
T
K S
A E
L
6
How many ancestors of K?
Q
V
T
K S
A E
L
7
A Binary Tree with Tree Nodes
Q
V
T
K S
A E
L
8
Node Terminology for a Tree Node
9
Binary Trees
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
10
Tree Traversals
Insertion, deletion, and lookup (and other) operations require that the binary tree be traversed
Commonly used traversals Inorder traversal Preorder traversal Postorder traversal
11
Tree Traversals: In Order Print
12
Inorder (tree): LeftNodeRight Binary tree is traversed as follows:
Traverse left subtree Visit node Traverse right subtree
private void inorder(BinaryTreeNode<T> t){ if (t != null) { inorder(t.lLink); System.out.print(t.info + “ “); inorder(t.rLink); }}
To print in alphabetical order
13
Postorder (tree): LeftRightNode Binary tree is traversed as follows:
Traverse left subtree Traverse right subtree Visit node
private void postorder(BinaryTreeNode<T> t){ if (t != null){ postorder(t.lLink); postorder(t.rLink); System.out.print(t.info + “ “); } } Visits leaves first (good for deletion)
14
Preorder (tree): NodeLeftRight Binary tree is traversed as follows:
Visit node Traverse left subtree Traverse right subtree
private void preorder(BinaryTreeNode<T> t){ if (t != null) { System.out.print(t.info + “ “); preorder(t.lLink); preorder(t.rLink); }} Useful with binary trees (not BST)
15
Three Tree Traversals
16
Binary Search Trees (BST)
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
17
A special kind of binary tree in which:
1. Each node contains a distinct data value,
2. The key values in the tree can be compared using “greater than” and “less than”, and
3. The key value of each node in the tree is
less than every key value in its right subtree, and greater than every key value in its left subtree.
So, a Binary Search Tree (BST) is . . .
18
Depends on its key values and their order of insertion.
Insert the elements ‘J’ ‘E’ ‘F’ ‘T’ ‘A’ in that order.
The first value to be inserted is put into the root node.
The shape of a binary search tree . . .
‘J’
19
Thereafter, each value to be inserted begins by comparing itself to the value in the root node, moving left it is less, or moving right if it is greater. This continues at each level until it can be inserted as a new leaf.
Inserting ‘E’ into the BST
‘J’
‘E’
20
Begin by comparing ‘F’ to the value in the root node, moving left it is less, or moving right if it is greater. This continues until it can be inserted as a leaf.
Inserting ‘F’ into the BST
‘J’
‘E’
‘F’
21
Begin by comparing ‘T’ to the value in the root node, moving left it is less, or moving right if it is greater. This continues until it can be inserted as a leaf.
Inserting ‘T’ into the BST
‘J’
‘E’
‘F’
‘T’
22
Begin by comparing ‘A’ to the value in the root node, moving left it is less, or moving right if it is greater. This continues until it can be inserted as a leaf.
Inserting ‘A’ into the BST
‘J’
‘E’
‘F’
‘T’
‘A’
23
is obtained by inserting
the elements ‘A’ ‘E’ ‘F’ ‘J’ ‘T’ in that order?
What binary search tree . . .
‘A’
24
obtained by inserting
the elements ‘A’ ‘E’ ‘F’ ‘J’ ‘T’ in that order.
Binary search tree . . .
‘A’
‘E’
‘F’
‘J’
‘T’
25
Another binary search tree
Add nodes containing these values in this order:
‘D’ ‘B’ ‘L’ ‘Q’ ‘S’ ‘V’ ‘Z’
‘J’
‘E’
‘A’ ‘H’
‘T’
‘M’
‘K’ ‘P’
26
Is ‘F’ in the binary search tree?
‘J’
‘E’
‘A’ ‘H’
‘T’
‘M’
‘K’
‘V’
‘P’ ‘Z’‘D’
‘Q’‘L’‘B’
‘S’
27
Tree RecursionMethod countNodes (pseudocode):
if tree is nullreturn 0
else return countNodes(Left(tree)) +
countNodes(Right(tree)) + 1
28
The Search Operation
29
The Search Operation
public boolean search(T item) { return recSearch(root, item);} //helper: recursive method called by searchpublic boolean recSearch(BinaryTreeNode<T> tree, T item) { if(tree == null) return false; else { Comparable<T> temp = (Comparable<T>) tree.info; if (temp.compareTo(item) == 0) return true; else if (temp.compareTo(item) > 0) return recSearch(tree.lLink, item); else return recSearch(tree.rLink, item); }}
30
The Insert Operation
Important: A new node is always inserted into its appropriate position in the binary search tree as a leaf.
31
Insertions into a Binary Search Tree
32
The Insert Operationpublic void insert(T item) { root = recInsert(root, item);} //helper: recursive method called by insertpublic BinaryTreeNode<T> recInsert(BinaryTreeNode<T> tree, T item) { if(tree == null) { //create new node tree = new BinaryTreeNode<T>(item); } else { Comparable<T> temp = (Comparable<T>) tree.info; if (temp.compareTo(item) == 0) { System.err.print("Already in - no duplicates."); return null; } else if (temp.compareTo(item) > 0) tree.lLink = recInsert(tree.lLink, item); else tree.rLink = recInsert(tree.rLink, item); } return tree;}
33
The Delete Operation
The delete operation has 3 cases Node to be deleted is a leaf Node to be deleted has 1 child (left OR
right) Node to be deleted has 2 children
(nonempty left and right subtrees)
34
Deleting a Leaf Node
35
Deleting a Node with One Child
36
Deleting a Node with Two Children (Q)
37
The Delete Operation
Base Case: If item's key matches Info(tree), delete node
General Case: If item < Info(tree), delete(Left(tree), item);
else
delete(Right(tree), item).
38
Code for Recursive Deletepublic void delete(T item) { root = recDelete(root, item);} //helper: recursive method called by deletepublic BinaryTreeNode<T> recDelete(BinaryTreeNode<T> tree, T item) { if(tree == null){ //empty tree System.err.println("Cannot delete from an empty tree."); return null; } else { Comparable<T> temp = (Comparable<T>) tree.info; if (temp.compareTo(item) > 0) tree.lLink = recDelete(tree.lLink, item); else if(temp.compareTo(item) < 0) tree.rLink = recDelete(tree.rLink, item); else if(tree.lLink != null && tree.rLink != null) {// 2 children tree.info = findMin(tree.rLink).info; //tree.info = findMax(tree.lLink).info; tree.rLink = removeMin(tree.rLink); } else if(root.lLink != null) //1 left child tree = tree.lLink; else if(root.rLink != null) //1 right child tree = tree.rLink; return tree; } }
39
Code for Recursive Delete
//helper: method called by recDelete
protected BinaryTreeNode<T> findMin(BinaryTreeNode<T> tree) {
if(tree != null)
while(tree.lLink != null)
tree = tree.lLink;
return tree;
}
//helper: method called by recDelete
protected BinaryTreeNode<T> removeMin(BinaryTreeNode<T> tree) {
if(tree == null){ //empty tree
System.err.println("Cannot delete from an empty tree.");
return null;
}
else if(tree.lLink != null) {
tree.lLink = removeMin(tree.lLink);
return tree;
}
else
return tree.rLink;
}