Outline In this topic we will look at:

Slides:



Advertisements
Similar presentations
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
Advertisements

ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
More Trees COL 106 Amit Kumar and Shweta Agrawal Most slides courtesy : Douglas Wilhelm Harder, MMath, UWaterloo
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
Shortest Paths Introduction to Algorithms Shortest Paths CSE 680 Prof. Roger Crawfis.
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
INTRODUCTION TO BINARY TREES P SORTING  Review of Linear Search: –again, begin with first element and search through list until finding element,
A Binary Search Tree Binary Search Trees.
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
1 Chapter 10 Trees. 2 Definition of Tree A tree is a set of linked nodes, such that there is one and only one path from a unique node (called the root.
CMSC 341 B- Trees D. Frey with apologies to Tom Anastasio.
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
Decimal Numbers Douglas Wilhelm Harder Department of Electrical and Computer Engineering University of Waterloo Copyright © 2007 by Douglas Wilhelm Harder.
AVL Trees 1. 2 Outline Background Define balance Maintaining balance within a tree –AVL trees –Difference of heights –Rotations to maintain balance.
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo, Ontario, Canada ece.uwaterloo.ca.
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
CMSC 341 Introduction to Trees. 2/21/20062 Tree ADT Tree definition –A tree is a set of nodes which may be empty –If not empty, then there is a distinguished.
1/14/20161 BST Operations Data Structures Ananda Gunawardena.
1 The tree data structure Outline In this topic, we will cover: –Definition of a tree data structure and its components –Concepts of: Root, internal, and.
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
8/3/2007CMSC 341 BTrees1 CMSC 341 B- Trees D. Frey with apologies to Tom Anastasio.
ECE 250 Algorithms and Data Structures Douglas Wilhelm Harder, M.Math. LEL Department of Electrical and Computer Engineering University of Waterloo Waterloo,
1 Binary search trees Outline This topic covers binary search trees: –Abstract Sorted Lists –Background –Definition and examples –Implementation: Front,
1 N -ary trees This topic quickly looks at a generalization of a binary tree, where each node has up to N children –Definition –Perfect N -ary trees –Complete.
1 Binary trees Outline In this talk, we will look at the binary tree data structure: –Definition –Properties –A few applications Ropes (strings) Expression.
1 Complete binary trees Outline Introducing complete binary trees –Background –Definitions –Examples –Logarithmic height –Array storage.
Outline In this topic, we will: Define a binary min-heap
The mechanics of recursion
CMSC 341 Introduction to Trees 8/3/2007 CMSC 341 Tree Intro.
Data Structures Binary Trees 1.
Open Addressing: Quadratic Probing
AVL Trees.
UNIT III TREES.
Outline Introducing perfect binary trees Definitions and examples
CMSC 341 Introduction to Trees.
Outline This topic discusses the insertion sort We will discuss:
ITEC 2620M Introduction to Data Structures
O(lg n) Search Tree Tree T is a search tree made up of n elements: x0 x1 x2 x3 … xn-1 No function (except transverse) takes more than O(lg n) in the.
Binary Search Trees.
Multiway Search Trees.
Data Structures and Database Applications Binary Trees in C#
Balanced-Trees This presentation shows you the potential problem of unbalanced tree and show two way to fix it This lecture introduces heaps, which are.
Binary Trees.
B- Trees D. Frey with apologies to Tom Anastasio
B- Trees D. Frey with apologies to Tom Anastasio
Data Structures and Algorithms
Balanced-Trees This presentation shows you the potential problem of unbalanced tree and show two way to fix it This lecture introduces heaps, which are.
B- Trees D. Frey with apologies to Tom Anastasio
CMSC 341 Introduction to Trees CMSC 341 Tree Intro.
CS 261 – Data Structures Trees.
CSC 143 Binary Search Trees.
Binary Search Trees.
Yan Shi CS/SE 2630 Lecture Notes
B-Trees.
EECE.3220 Data Structures Instructor: Dr. Michael Geiger Spring 2019
Chapter 11 Trees © 2011 Pearson Addison-Wesley. All rights reserved.
Presentation transcript:

Outline In this topic we will look at: In-order traversals of binary search trees Limitations of in-order traversals with n-ary trees An introduction to multiway search trees An implementation in C++ In-order traversals of multiway trees

In-order Traversals We’ve seen two depth-first traversals: 4.11.1 We’ve seen two depth-first traversals: Pre-order Post-order First and last visits during an Euler walk

In-order Traversals 4.11.1 For binary trees, there is a third intermediate visit An in-order depth-first traversal

In-order Traversals This visits a binary search tree in order 4.11.1 This visits a binary search tree in order A, B, C, D, E, F, G, H, I, J

Application An implementation of an in-order traversal template <typename Type> void Binary_tree<Type>::in_order_traversal() const { if ( empty() ) { return; } left()->in_order_traversal(); cout << retrieve(); right()->in_order_traversal();

In-order traversals on expression trees 4.11.1.1 Printing an expression tree (pretty printing or human-readable printing) using in-fix notation requires an in-order traversal (3x + 5 + y)(z + 7)

Application class Expression_node; void Expression_node::pretty_print() { if ( !leaf() ) { // If the precedence of the parent is higher than that of the // current operator, we need to print an opening parenthesis if ( parent()->precedence() > precedence() ) { cout << "("; } // pre-order visit left()->pretty_print(); // traverse left tree } // The in-order step: print this object cout << this; // print this object

Application if ( !leaf() ) { right()->pretty_print(); // traverse right sub-tree // If the precedence of the parent is higher than that of the // current operator, we need to print a closing parenthesis if ( parent()->precedence() > precedence() ) { cout << ")"; } // post-order visit }

In-order traversals on general trees 4.11.1.3 An in-order traversal does not make sense for either general trees or N-ary trees with N > 2

3-Way Trees 6.4.2 Suppose we had a node storing two values and with three sub-trees:

3-Way Trees This could be implemented as follows: 6.4.2 left_element template <typename Type> class Three_way_node { Three_way_node *left_tree; Type first_element; Three_way_node *middle_tree; Type second_element; Three_way_node *right_tree; // ... }; left_element right_element left_tree middle_tree right_tree

3-Way Trees In order to define a search tree, we will require that: 6.4.2 In order to define a search tree, we will require that: The first element is less than the second element All sub-trees are 3-way trees The left sub-tree contains items less than the 1st element The middle sub-tree contains items between the two elements The right sub-tree contains items greater than the 2nd element left_element right_element left_tree middle_tree right_tree

3-Way Trees 6.4.2 If a node has only one element, all trees are assumed to be empty If a second object is inserted, it will be inserted into this node template <typename Type> class Three_way_node { Three_way_node *left_tree; Type first_element; Three_way_node *middle_tree; Type second_element; Three_way_node *right_tree; int num_elements; # 1 or 2 // ... }; bool Three_way_node::full() const { return num_elements == 2; }

3-Way Trees Most operations are more complex than with binary trees… 6.4.2.1 Most operations are more complex than with binary trees… template <typename Type> bool Three_way_node<Type>::find( Type const &obj ) const { if ( empty() ) { return false; } else if ( !full() ) { return ( first() == obj ); } if ( obj < first() ) { return left()->find( obj ); } else if ( obj == first() ) { return true; } else if ( obj > first() && obj < second() ) { return middle()->find( obj ); } else if ( obj == second() ) { } else { return right()->find( obj );

3-Way Trees Insertion also becomes much more interesting 6.4.2.1 template <typename Type> bool Three_way_node<Type>::insert( Type const &obj, Three_way_node<Type> *&ptr_to_this ) { if ( empty() ) { ptr_to_this = new Three_way_node( obj ); return true; } if ( !full() ) { if ( obj == first() ) { return false; } else if ( obj < first() ) { second_element = first(); first_element = obj; } else { second_element = obj; num_elements = 2;

3-Way Trees if ( obj == first() || obj == second() ) { 6.4.2.1 if ( obj == first() || obj == second() ) { return false; } if ( obj < first() ) { return left()->insert( obj ); } else if ( obj > second() ) { return right()->insert( obj ) ; } else { return middle()->insert( obj ); Erasing an element is even more complex There are many more cases to consider

Insertion into 3-Way Trees 6.4.2.2 Consider inserting values into an empty 3-way tree: Starting with 68, it would be inserted into the root

Insertion into 3-Way Trees 6.4.2.2 If 27 was inserted next, it would be fit into the root node

Insertion into 3-Way Trees 6.4.2.2 If 27 was inserted next, it would be fit into the root node

Insertion into 3-Way Trees 6.4.2.2 Any new insertion would create an appropriate sub-tree Inserting 91, we note that 91 > 68, so a right sub-tree is constructed

Insertion into 3-Way Trees 6.4.2.2 Any new insertion would create an appropriate sub-tree Inserting 91, we note that 91 > 68, so a right sub-tree is constructed

Insertion into 3-Way Trees 6.4.2.2 If we insert 38, we note that 28 < 38 < 68 and thus build a new sub-tree in the middle

Insertion into 3-Way Trees 6.4.2.2 If we insert 38, we note that 28 < 38 < 68 and thus build a new sub-tree in the middle

Insertion into 3-Way Trees 6.4.2.2 At this point, if we insert 82, we note 82 > 68 and the right sub-tree is not yet full

Insertion into 3-Way Trees 6.4.2.2 At this point, if we insert 82, we note 82 > 68 and the right sub-tree is not yet full

Insertion into 3-Way Trees 6.4.2.2 If we insert 14, we note 14 < 27, so we create a new node

Insertion into 3-Way Trees 6.4.2.2 If we insert 14, we note 14 < 27, so we create a new node

Insertion into 3-Way Trees 6.4.2.2 Next, inserting 62, 27 < 62 < 28 so we insert it into the middle sub-tree which also is not full

Insertion into 3-Way Trees 6.4.2.2 Next, inserting 62, 27 < 62 < 28 so we insert it into the middle sub-tree which also is not full

Insertion into 3-Way Trees 6.4.2.2 If we insert 45, First, 27 < 45 < 68 and then 38 < 45 < 62

Insertion into 3-Way Trees 6.4.2.2 If we insert 45, First, 27 < 45 < 68 and then 38 < 45 < 62

Insertion into 3-Way Trees 6.4.2.2 If we insert 76, we note 68 > 76 but then 76 < 82 Create a new left sub-tree of the 82-91 node

Insertion into 3-Way Trees 6.4.2.2 If we insert 76, we note 68 > 76 but then 76 < 82 Create a new left sub-tree of the 82-91 node

Insertion into 3-Way Trees 6.4.2.2 If we insert 4, 4 < 27 and the left sub-tree contains only a single element

Insertion into 3-Way Trees 6.4.2.2 If we insert 4, 4 < 27 and the left sub-tree contains only a single element

Insertion into 3-Way Trees 6.4.2.2 If we insert 51, 27 < 51 < 68 and 38 < 51 < 62; therefore, we insert 51 into the node containing 45

Insertion into 3-Way Trees 6.4.2.2 If we insert 51, 27 < 51 < 68 and 38 < 51 < 62; therefore, we insert 51 into the node containing 45

Insertion into 3-Way Trees 6.4.2.2 If we insert 8, 8 < 27 and then 4 < 8 < 14 Construct a new middle sub-tree of the 4-14 node

Insertion into 3-Way Trees 6.4.2.2 If we insert 8, 8 < 27 and then 4 < 8 < 14 Construct a new middle sub-tree of the 4-14 node

Insertion into 3-Way Trees 6.4.2.2 If we insert 98, 98 > 68 and 98 > 91 Construct a new right sub-tree of the 81-91 node

Insertion into 3-Way Trees 6.4.2.2 If we insert 98, 98 > 68 and 98 > 91 Construct a new right sub-tree of the 81-91 node

Insertion into 3-Way Trees 6.4.2.2 Finally, consider adding 57: 27 < 57 < 68, 38 < 57 < 62 and 57 > 51 Construct a new right sub-tree of the 45-51 node

Insertion into 3-Way Trees 6.4.2.2 Finally, consider adding 57: 27 < 57 < 68, 38 < 57 < 62 and 57 > 51 Construct a new right sub-tree of the 45-51 node

In-order Traversals 6.4.2.1 template <typename Type> void Three_way_node<Type>::in_order_traversal() const { if ( empty() ) { return; } if ( !full() ) { cout << first(); } else { left()->in_order_traversal(); middle()->in_order_traversal(); cout << second(); right()->in_order_traversal();

In-order Traversals 6.4.2.3 An in-order traversal can be performed on this tree: 4 8 14 27 38 45 51 57 62 68 76 82 91 98

Multiway tree implementation 6.4.3 Suppose we had a node storing N – 1 values and with N sub-trees We will describe this as an N-way tree template <typename Type, int N> class Multiway_node { private: int num_elements; Type elements[N – 1]; Multiway_node *[N]; // an array of pointers to multiway nodes public: Multiway_node( Type const & ); // ... }; template<typename Type, int M> bool M_ way_node<Type, M>::full() const { return ( num_elements == M - 1 ); }

Multiway tree implementation 6.4.3 The constructor would initial the node to store one element template <typename Type, int N> Multiway_node<Type, N>::Multiway_node( Type const &obj ): num_elements( 1 ) { elements[0] = obj; // All sub-treees are null sub-trees for ( int i = 0; i < N; ++i ) { subtrees[i] = nullptr; }

Multiway tree implementation 6.4.3 An in-order traversal would be similar: template <typename Type, int N> void Multiway_node<Type, N>::in_order_traversal() const { if ( empty() ) { return; } else if ( !full() ) { for ( int i = 0; i < num_elements; ++i ) { cout << elements[i]; } } else { for ( int i = 0; i < N - 1; ++i ) { subtrees[i]->in_order_traversal(); subtrees[N - 1]->in_order_traversal();

Size 6.4.3.1 Question: What is the maximum number of elements which may be stored in a multiway tree of height h? We will consider 3-way trees and, if possible, generalize

Size Examining these perfect 3-way trees we get the table: h Size 6.4.3.1 Examining these perfect 3-way trees we get the table: h Size Formula 2 31 – 1 1 8 32 – 1 26 33 – 1 3 80 34 – 1

Size Suggested form: Observations To prove this, we need only observe: 6.4.3.1 Suggested form: The maximum number of nodes in a perfect multiway tree of height h is Nh + 1 – 1 Observations This is true when N = 2: 2h + 1 – 1 To prove this, we need only observe: A perfect N-ary tree of height h has nodes Thus, if each node now has N – 1 elements:

Size Note also that the majority of elements are in the leaf nodes: 6.4.3.2 Note also that the majority of elements are in the leaf nodes: There are Nh leaf nodes in a perfect M-way search tree of height h Each of these stores N – 1 elements Thus, we may calculate the ratio For example: In an 8-way search tree, ~87.5 % of elements are in leaf nodes In a 100-way search tree, ~99 % of elements are in the leaf nodes

Minimum height 6.4.3.3 The minimum height of a multiway tree storing n elements is ⌊logN(n)⌋ For large N, the depth is potentially much less than a binary tree A plot of the minimum height of a multiway tree for N = 2, 3, ..., 20 for up to one-million elements

8-way trees versus binary trees 6.4.3.3 Compare: A perfect 8-way tree with h = 2 511 elements in 73 nodes A perfect binary tree with h = 8 511 elements in 511 nodes

8-way tree example A sample 8-way search tree: 6.4.3.4 Note how a binary search is required to find the appropriate sub-tree How do you determine if 43 is in this search tree? Question: what order would these entries have been inserted? How do we erase an element?

Multiway trees Advantage: Disadvantage: 6.4.3.4 Advantage: Shorter paths from the root Disadvantage: More complex Under what conditions is the additional complexity worth the effort? When the cost from jumping nodes is exceptionally dominant

Summary In this topic, we have looked at: In-order depth-first traversals Limitations on N-ary and binary trees Multiway trees Each node stores N – 1 sorted elements N sub-trees interleave the elements Perfect Multiway trees store Nh +1 – 1 elements We saw an implementation in C++ We considered in-order traversals of multiway trees Has the potential to store more elements in shallower trees

References [1] Cormen, Leiserson, and Rivest, Introduction to Algorithms, MIT Press, 1990, §7.1-3, p.152. [2] Weiss, Data Structures and Algorithm Analysis in C++, 3rd Ed., Addison Wesley, §6.5-6, p.215-25.

Usage Notes These slides are made publicly available on the web for anyone to use If you choose to use them, or a part thereof, for a course at another institution, I ask only three things: that you inform me that you are using the slides, that you acknowledge my work, and that you alert me of any mistakes which I made or changes which you make, and allow me the option of incorporating such changes (with an acknowledgment) in my set of slides Sincerely, Douglas Wilhelm Harder, MMath dwharder@alumni.uwaterloo.ca