Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Binary Tree - B Tree

Download as pdf or txt
Download as pdf or txt
You are on page 1of 69

Data Structures Using C++ 2E

Chapter 11
Binary Trees and B-Trees
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

Data Structures Using C++ 2E 2


Objectives (cont’d.)

• Explore nonrecursive binary tree traversal


algorithms
• Learn about AVL (height-balanced) trees
• Learn about B-trees

Data Structures Using C++ 2E 3


Binary Trees

• Definition: a binary tree, T, is either empty or such


that
– 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 of T, respectively
– LT and RT are binary trees
• Can be shown pictorially
– Parent, left child, right child
• Node represented as a circle
– Circle labeled by the node
Data Structures Using C++ 2E 4
Binary Trees (cont’d.)
• Root node drawn at the top
– Left child of the root node (if any)
• Drawn below and to the left of the root node
– Right child of the root node (if any)
• Drawn below and to the right of the root node
• Directed edge (directed branch): arrow

FIGURE 11-1 Binary tree


Data Structures Using C++ 2E 5
Binary Trees (cont’d.)

FIGURE 11-2 Binary tree with one, two, or three nodes

FIGURE 11-3 Various binary trees with three nodes

Data Structures Using C++ 2E 6


Binary Trees (cont’d.)
• Every node in a binary tree
– Has at most two children
• struct defining node of a binary tree
– For each node
• The data stored in info
• A pointer to the left child stored in llink
• A pointer to the right child stored in rlink

Data Structures Using C++ 2E 7


Binary Trees (cont’d.)

• Pointer to root node is stored outside the binary tree


– In pointer variable called the root
• Of type binaryTreeNode

FIGURE 11-4 Binary tree


Data Structures Using C++ 2E 8
Binary Trees (cont’d.)

• Level of a node
– Number of branches on the path
• Height of a binary tree
– Number of nodes on the longest path from the root to
a leaf
– See code on page 604

Data Structures Using C++ 2E 9


Copy Tree
• Shallow copy of the data
– Obtained when value of the pointer of the root node
used to make a copy of a binary tree
• Identical copy of a binary tree
– Need to create as many nodes as there are in the
binary tree to be copied
– Nodes must appear in the same order as in the
original binary tree
• Function copyTree
– Makes a copy of a given binary tree
– See code on pages 604-605
Data Structures Using C++ 2E 10
Binary Tree Traversal

• Must start with the root, and then


– Visit the node first or
– Visit the subtrees first
• Three different traversals
– Inorder
– Preorder
– Postorder

Data Structures Using C++ 2E 11


Binary Tree Traversal (cont’d.)

• Inorder traversal
– Traverse the left subtree
– Visit the node
– Traverse the right subtree
• Preorder traversal
– Visit the node
– Traverse the left subtree
– Traverse the right subtree

Data Structures Using C++ 2E 12


Binary Tree Traversal (cont’d.)

• Postorder traversal
– Traverse the left subtree
– Traverse the right subtree
– Visit the node
• Each traversal algorithm: recursive
• Listing of nodes
– Inorder sequence
– Preorder sequence
– Postorder sequence

Data Structures Using C++ 2E 13


Binary Tree Traversal (cont’d.)

FIGURE 11-5 Binary tree


for an inorder traversal

Data Structures Using C++ 2E 14


Binary Tree Traversal (cont’d.)

• Functions to implement the preorder and postorder


traversals

Data Structures Using C++ 2E 15


Implementing Binary Trees

• Operations typically performed on a binary tree


– Determine if binary tree is empty
– Search binary tree for a particular item
– Insert an item in the binary tree
– Delete an item from the binary tree
– Find the height of the binary tree
– Find the number of nodes in the binary tree
– Find the number of leaves in the binary tree
– Traverse the binary tree
– Copy the binary tree
Data Structures Using C++ 2E 16
Implementing Binary Trees (cont’d.)

• class binaryTreeType
– Specifies basic operations to implement a binary tree
– See code on page 609
• Contains statement to overload the assignment
operator, copy constructor, destructor
• Contains several member functions that are private
members of the class
• Binary tree empty if root is NULL
– See isEmpty function on page 611

Data Structures Using C++ 2E 17


Implementing Binary Trees (cont’d.)

• Default constructor
– Initializes binary tree to an empty state
– See code on page 612
• Other functions for binary trees
– See code on pages 612-613
• Functions: copyTree, destroy, destroyTree
– See code on page 614
• Copy constructor, destructor, and overloaded
assignment operator
– See code on page 615
Data Structures Using C++ 2E 18
Binary Search Trees

• Data in each node


– Larger than the data in its left child
– Smaller than the data in its right child

FIGURE 11-6 Arbitrary binary tree FIGURE 11-7 Binary search tree

Data Structures Using C++ 2E 19


Binary Search Trees (cont’d.)

• A binary search tree, T, is either empty or the


following is true:
– 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 of T, respectively
– The key in the root node is larger than every key in
the left subtree and smaller than every key in the right
subtree
– LT and RT are binary search trees

Data Structures Using C++ 2E 20


Binary Search Trees (cont’d.)

• Operations performed on a binary search tree


– Search the binary search tree for a particular item
– Insert an item in the binary search tree
– Delete an item from the binary search tree
– Find the height of the binary search tree
– Find the number of nodes in the binary search tree
– Find the number of leaves in the binary search tree
– Traverse the binary search tree
– Copy the binary search tree

Data Structures Using C++ 2E 21


Binary Search Trees (cont’d.)

• Every binary search tree is a binary tree


• Height of a binary search tree
– Determined the same way as the height of a binary
tree
• Operations to find number of nodes, number of
leaves, to do inorder, preorder, postorder traversals
of a binary search tree
– Same as those for a binary tree
• Can inherit functions

Data Structures Using C++ 2E 22


Binary Search Trees (cont’d.)

• class bSearchTreeType
– Illustrates basic operations to implement a binary
search tree
– See code on page 618
• Function search
• Function insert
• Function delete

Data Structures Using C++ 2E 23


Binary Search Tree: Analysis
• Worst case
– T: linear
– Successful case
• Algorithm makes (n + 1) / 2 key comparisons (average)
– Unsuccessful case: makes n comparisons

FIGURE 11-10 Linear binary trees


Data Structures Using C++ 2E 24
Binary Search Tree: Analysis (cont’d.)
• Average-case behavior
– Successful case
• Search would end at a node
• n items exist, providing n! possible orderings of the
keys
– Number of comparisons required to determine
whether x is in T
• One more than the number of comparisons required to
insert x in T
– Number of comparisons required to insert x in T
• Same as number of comparisons made in the
unsuccessful search reflecting that x is not in T
Data Structures Using C++ 2E 25
Binary Search Tree: Analysis (cont’d.)

Data Structures Using C++ 2E 26


Binary Search Tree: Analysis (cont’d.)

• Theorem: let T be a binary search tree with n nodes,


where n> 0
– The average number of nodes visited in a search of T
is approximately 1.39log2n =O(log2n)
– The number of key comparisons is approximately
2.77 log2n = O(log2n)

Data Structures Using C++ 2E 27


Nonrecursive Inorder Traversal

Data Structures Using C++ 2E 28


Nonrecursive Inorder Traversal
(cont’d.)

Data Structures Using C++ 2E 29


Nonrecursive Preorder Traversal

Data Structures Using C++ 2E 30


Nonrecursive Preorder Traversal
(cont’d.)

Data Structures Using C++ 2E 31


Nonrecursive Postorder Traversal

Data Structures Using C++ 2E 32


Binary Tree Traversal and Functions
as Parameters
• Passing a function as a parameter to the traversal
algorithms
– Enhances program’s flexibility
• C++ function name without any parentheses
– Considered a pointer to the function
• Specifying a function as a formal parameter to
another function
• See Example 11-3

Data Structures Using C++ 2E 33


AVL (Height-Balanced) Trees

• AVL tree (height-balanced tree)


– Resulting binary search is nearly balanced
• Perfectly balanced binary tree
– Heights of left and right subtrees of the root: equal
– Left and right subtrees of the root are perfectly
balanced binary trees

FIGURE 11-12 Perfectly balanced binary tree


Data Structures Using C++ 2E 34
AVL (Height-Balanced) Trees (cont’d.)

• An AVL tree (or height-balanced tree) is a binary


search tree such that
– The heights of the left and right subtrees of the root
differ by at most one
– The left and right subtrees of the root are AVL trees

FIGURE 11-13 AVL and non-AVL trees


Data Structures Using C++ 2E 35
AVL (Height-Balanced) Trees (cont’d.)

Data Structures Using C++ 2E 36


AVL (Height-Balanced) Trees (cont’d.)

• Definition of a node in the AVL tree

Data Structures Using C++ 2E 37


AVL (Height-Balanced) Trees (cont’d.)

• AVL binary search tree search algorithm


– Same as for a binary search tree
– Other operations on AVL trees
• Implemented exactly the same way as binary trees
– Item insertion and deletion operations on AVL trees
• Somewhat different from binary search trees operations

Data Structures Using C++ 2E 38


Insertion

• First search the tree and find the place where the
new item is to be inserted
– Can search using algorithm similar to search
algorithm designed for binary search trees
– If the item is already in tree
• Search ends at a nonempty subtree
• Duplicates are not allowed
– If item is not in AVL tree
• Search ends at an empty subtree; insert the item there
• After inserting new item in the tree
– Resulting tree might not be an AVL tree
Data Structures Using C++ 2E 39
Insertion (cont’d.)

FIGURE 11-14 AVL tree before and after inserting 90

FIGURE 11-15 AVL tree before and after inserting 75


Data Structures Using C++ 2E 40
Insertion (cont’d.)

FIGURE 11-16 AVL tree before and after inserting 95

FIGURE 11-17 AVL tree before and after inserting 88


Data Structures Using C++ 2E 41
AVL Tree Rotations

• Rotating tree: reconstruction procedure


• Left rotation and right rotation
• Suppose that the rotation occurs at node x
– Left rotation: certain nodes from the right subtree of x
move to its left subtree; the root of the right subtree of
x becomes the new root of the reconstructed subtree
– Right rotation at x: certain nodes from the left subtree
of x move to its right subtree; the root of the left
subtree of x becomes the new root of the
reconstructed subtree

Data Structures Using C++ 2E 42


FIGURE 11-18 Right rotation at b

FIGURE 11-19 Left rotation at a


Data Structures Using C++ 2E 43
FIGURE 11-20 Double rotation: First rotate left at a and then right at c

FIGURE 11-21 Left rotation at a followed by a right rotation at c


Data Structures Using C++ 2E 44
AVL Tree Rotations (cont’d.)

FIGURE 11-22 Double rotation: First rotate right at c,


then rotate left at a

Data Structures Using C++ 2E 45


Data Structures Using C++ 2E 46
Data Structures Using C++ 2E 47
Data Structures Using C++ 2E 48
AVL Tree Rotations (cont’d.)

• Steps describing the function insertIntoAVL


– Create node and copy item to be inserted into the
newly created node
– Search the tree and find the place for the new node in
the tree
– Insert new node in the tree
– Backtrack the path, which was constructed to find the
place for the new node in the tree, to the root node
• If necessary, adjust balance factors of the nodes, or
reconstruct the tree at a node on the path

Data Structures Using C++ 2E 49


FIGURE 11-23 Item insertion into an initially empty AVL tree
Data Structures Using C++ 2E 50
AVL Tree Rotations (cont’d.)

• Function insert
– Creates a node, stores the info in the node, and calls
the function insertIntoAVL to insert the new node
in the AVL tree

Data Structures Using C++ 2E 51


Deletion from AVL Trees

• Four cases
– Case 1: The node to be deleted is a leaf
– Case 2: The node to be deleted has no right child,
that is, its right subtree is empty
– Case 3: The node to be deleted has no left child, that
is, its left subtree is empty
– Case 4: The node to be deleted has a left child and a
right child
• Cases 1–3
– Easier to handle than Case 4

Data Structures Using C++ 2E 52


Analysis: AVL Trees

• Consider all possible AVL trees of height h


– Let Th be an AVL tree of height h such that Th has the
fewest number of nodes
– Let Thl denote the left subtree of Th and Thr denote the
right subtree of Th
– Then:

• where |Th| denotes the number of nodes in Th

Data Structures Using C++ 2E 53


Analysis: AVL Trees (cont’d.)
• Suppose:
– Thl is of height h – 1 and Thr is of height h – 2
• Thl is an AVL tree of height h – 1 such that Thl has the
fewest number of nodes among all AVL trees of height
h–1
– Thr is an AVL tree of height h – 2 that has the fewest
number of nodes among all AVL trees of height h – 2
• Thl is of the form Th -1 and Thr is of the form Th -2
– Hence:

Data Structures Using C++ 2E 54


Data Structures Using C++ 2E 55
B-Trees
• Leaves on the same level
– Not too far from the root
• m-way search tree
– Tree in which each node has at most m children
• If the tree is nonempty, it has the following properties:

Data Structures Using C++ 2E 56


B-Trees (cont’d.)
• B-tree of order m
– m-way search tree
– Either empty or has the following properties:

• Basic operations
– Search the tree, insert an item, delete an item,
traverse the tree

Data Structures Using C++ 2E 57


B-Trees (cont’d.)

FIGURE 11-24 A 5-way search tree

FIGURE 11-25 A B-tree of order 5


Data Structures Using C++ 2E 58
B-Trees (cont’d.)
• Constant expressions
– May be passed as parameters to templates
• Definition of a B-tree node
• Class implementing B-tree properties
– See code on pages 664-665
• Implements B-tree basic properties as an ADT

Data Structures Using C++ 2E 59


Search

• Searches binary search tree for a given item


– If item found in the binary search tree: returns true
– Otherwise: returns false
• Search must start at root node
• More than one item in a node (usually)
– Must search array containing the data
• Two functions required
– Function search
– Function searchNode
• Searches a node sequentially
Data Structures Using C++ 2E 60
Traversing a B-Tree
• B-tree traversal methods
– Inorder, preorder, postorder

Data Structures Using C++ 2E 61


Insertion into a B-Tree

• Algorithm: search tree to see if key already exists


– If key already in the tree: output an error message
– If key not in the tree: search terminates at a leaf
– Record inserted into the leaf: if room exists
• If leaf full: split node into two nodes
• Median key moved to parent node (median determined
by considering all keys in the node and new key)
– Splitting can propagate upward (even to the root)
• Causing tree to increase in height

Data Structures Using C++ 2E 62


Insertion into a B-Tree (cont’d.)

• Function insertBTree
– Recursively inserts an item into a B-tree
• Function insert uses function insertBTree
• Function insertNode
– Inserts item in the node
• Function splitNode
– Splits node into two nodes
– Inserts new item in the relevant node
– Returns median key and pointer to second half of the
node
Data Structures Using C++ 2E 63
FIGURE 11-26 Item insertion into a B-tree of order 5

FIGURE 11-27 Insertion of 73, 54, 98, and 37

FIGURE 11-28 Insertion of 25, 62, 81, 150, and 79


Data Structures Using C++ 2E 64
FIGURE 11-29 Insertion of 200

Data Structures Using C++ 2E 65


Deletion from a B-Tree
• Case to consider

Data Structures Using C++ 2E 66


FIGURE 11-30 A B-tree of order 5 FIGURE 11-31 Deleting 18 from
a B-tree of order 5

FIGURE 11-32 B-tree before and after deleting 30


Data Structures Using C++ 2E 67
FIGURE 11-33 Deletion of 70 from the B-tree

Data Structures Using C++ 2E 68


Summary

• This chapter discussed


– Binary trees
– Binary search trees
– Recursive traversal algorithms
– Nonrecursive traversal algorithms
– AVL trees
– B-trees

Data Structures Using C++ 2E 69

You might also like