Computer Science 112 Fundamentals of Programming II Binary Search Trees.

Slides:



Advertisements
Similar presentations
Computer Science 112 Fundamentals of Programming II Queues and Priority Queues.
Advertisements

S. Sudarshan Based partly on material from Fawzi Emad & Chau-Wen Tseng
Computer Science C++ High School Level By Guillermo Moreno.
Binary Trees, Binary Search Trees CMPS 2133 Spring 2008.
CS 171: Introduction to Computer Science II
Introduction to Data Structure, Fall 2006 Slide- 1 California State University, Fresno Introduction to Data Structure Chapter 10 Ming Li Department of.
CS 104 Introduction to Computer Science and Graphics Problems Data Structure & Algorithms (4) Data Structures 11/18/2008 Yang Song.
Liang, Introduction to Java Programming, Sixth Edition, (c) 2007 Pearson Education, Inc. All rights reserved L12 (Chapter 20) Lists, Stacks,
Chapter 12 C Data Structures Acknowledgment The notes are adapted from those provided by Deitel & Associates, Inc. and Pearson Education Inc.
Fundamentals of Python: From First Programs Through Data Structures
CS21, Tia Newhall Binary Search Trees (BST) 1.Hierarchical data structure with a single pointer to root node 2.Each node has at most two child nodes (a.
Binary Search Trees Section Trees Trees are efficient Many algorithms can be performed on trees in O(log n) time. Searching for elements.
Binary Trees. Node structure Data A data field and two pointers, left and right.
Data Structures Arrays both single and multiple dimensions Stacks Queues Trees Linked Lists.
Computer Science 112 Fundamentals of Programming II Expression Trees.
CSCE 3110 Data Structures & Algorithm Analysis Binary Search Trees Reading: Chap. 4 (4.3) Weiss.
Computer Science 112 Fundamentals of Programming II Introduction to Stacks.
Searching: Binary Trees and Hash Tables CHAPTER 12 6/4/15 Nyhoff, ADTs, Data Structures and Problem Solving with C++, Second Edition, © 2005 Pearson Education,
S EARCHING AND T REES COMP1927 Computing 15s1 Sedgewick Chapters 5, 12.
Chapter 19 Implementing Trees and Priority Queues Fundamentals of Java.
CISC220 Fall 2009 James Atlas Lecture 13: Trees. Skip Lists.
1 Trees A tree is a data structure used to represent different kinds of data and help solve a number of algorithmic problems Game trees (i.e., chess ),
Chapter 19 Implementing Trees and Priority Queues Fundamentals of Java.
Binary Trees 2 Overview Trees. Terminology. Traversal of Binary Trees. Expression Trees. Binary Search Trees.
Tree (new ADT) Terminology:  A tree is a collection of elements (nodes)  Each node may have 0 or more successors (called children)  How many does a.
Binary Trees, Binary Search Trees RIZWAN REHMAN CENTRE FOR COMPUTER STUDIES DIBRUGARH UNIVERSITY.
Chapter 19: Binary Trees Java Programming: Program Design Including Data Structures Program Design Including Data Structures.
Computer Science 112 Fundamentals of Programming II Interfaces and Implementations.
Starting at Binary Trees
Topic 15 The Binary Search Tree ADT Binary Search Tree A binary search tree (BST) is a binary tree with an ordering property of its elements, such.
Binary Search Trees Nilanjan Banerjee. 2 Goal of today’s lecture Learn about Binary Search Trees Discuss the first midterm.
Binary Search Tree Traversal Methods. How are they different from Binary Trees?  In computer science, a binary tree is a tree data structure in which.
Binary Search Tree Qamar Abbas.
Computer Science 112 Fundamentals of Programming II Implementation Strategies for Unordered Collections.
Computer Science 112 Fundamentals of Programming II Introduction to Trees.
© Copyright 2012 by Pearson Education, Inc. All Rights Reserved. 1 Chapter 19 Binary Search Trees.
David Stotts Computer Science Department UNC Chapel Hill.
1 Chapter 7 Objectives Upon completion you will be able to: Create and implement binary search trees Understand the operation of the binary search tree.
Week 10 - Friday.  What did we talk about last time?  Graph representations  Adjacency matrix  Adjacency lists  Depth first search.
1 Binary Trees and Binary Search Trees Based on Dale & Co: Object-Oriented Data Structures using C++ (graphics)
Binary Search Trees (BST)
Rooted Tree a b d ef i j g h c k root parent node (self) child descendent leaf (no children) e, i, k, g, h are leaves internal node (not a leaf) sibling.
Copyright © 2012 Pearson Education, Inc. Chapter 20: Binary Trees.
Trees Ellen Walker CPSC 201 Data Structures Hiram College.
1 Trees General Trees  Nonrecursive definition: a tree consists of a set of nodes and a set of directed edges that connect pairs of nodes.
Binary Tree Implementation. Binary Search Trees (BST) Nodes in Left subtree has smaller values Nodes in right subtree has bigger values.
Foundation of Computing Systems Lecture 4 Trees: Part I.
1 AVL Trees II Implementation. 2 AVL Tree ADT A binary search tree in which the balance factor of each node is 0, 1, of -1. Basic Operations Construction,
Chapter 12 – Data Structures
Trees Chapter 15.
CSCE 3110 Data Structures & Algorithm Analysis
CSCE 3110 Data Structures & Algorithm Analysis
Fundamentals of Programming II Introduction to Trees
Recursive Objects (Part 4)
Fundamentals of Programming II Binary Search Trees
Fundamentals of Programming II Interfaces and Implementations
Section 8.1 Trees.
Trees.
Computer Science 112 Fundamentals of Programming II
Topic 18 Binary Search Trees
Revised based on textbook author’s notes.
Binary Trees, Binary Search Trees
Chapter 20: Binary Trees.
Chapter 21: Binary Trees.
Stacks with Dynamic Memory
Trees.
Chapter 20: Binary Trees.
Trees.
Binary Tree Implementation
Binary Tree Implementation And Applications
Presentation transcript:

Computer Science 112 Fundamentals of Programming II Binary Search Trees

Recursive Binary Search def index(target, sortedList): def recurse(first, last): if first > last: return -1 # target not there else: mid = (first + last) // 2 # compute midpoint if sortedList[mid] == target: return mid # found target elif sortedList[mid] > target: return recurse(first, mid – 1) # go left else: return recurse(mid + 1, last) # go right return recurse(0, len(sortedList) – 1)

Call Tree for Binary Search

Call Tree for Binary Search

Call Tree for Binary Search

Binary Search Tree (BST)

Binary Search Tree (BST) Ordering principle: –Each item in the left subtree is less than the item in the parent –Each item in the right subtree is greater than the item in the parent

contains(target, node) If the node is None Return False Else if node.data equals the target Return True Else if the target is greater than the data Return contains(target, node.right) Else Return contains(target, node.left) Recursive Search of a BST Node

t.isEmpty()Returns True if empty, False otherwise len(t)Returns the number of items in the tree str(t)Returns a string representation iter(t)Supports a for loop, visiting in preorder item in tTrue if item is in tree, False otherwise t1 + t2Returns a new tree with items in t1 and t2 t1 == t2Equality test for two trees t.add(item)Adds item to the tree t.remove(item)Removes the given item The precondition of remove is that the item is in the tree. Minimal Set of BST Operations

t.preorder()Returns an iterator for preorder traversal t.inorder()Returns an iterator for inorder traversal t.postorder()Returns an iterator for postorder traversal t.levelorder()Returns an iterator for levelorder traversal t.height()Returns the number of links from the root to the deepest leaf t.isBalanced()Returns True if t.height() < 2 * log 2 (len(t) + 1) - 1 or False otherwise t.rebalance()Rearranges the nodes to ensure that t.height() <= log 2 (len(t) + 1) Tree-Specific Operations

tree = LinkedBST() tree.add("D") tree.add("B") tree.add("A") tree.add("C") tree.add("F") tree.add("E") tree.add("G") print(tree) print("F" in tree) for item in tree: print(item) for item in tree.inorder(): print(item) for item in tree.postorder(): print(item) for item in tree.levelorder(): print(item) for ch in ('A', 'B', 'C', 'D', 'E', 'F', 'G'): print(tree.remove(ch)) Using a Binary Search Tree

from abstractcollection import AbstractCollection from bstnode import BSTNode class LinkedBST(AbstractCollection): def __init__(self, sourceCollection = None): self._root = None AbstractCollection.__init__(self, sourceCollection) # Tree methods go here The LinkedBST Class

def __contains__(self, target): """Returns True if target is found or False otherwise.""” def recurse(node): if node is None: return False elif node.data == target: return True elif node.data > target: return recurse(node.left) else: return recurse(node.right) return recurse(self._root) Method contains Several operations call nested helper functions to recurse on nodes

def __contains__(self, target): """Returns True if target is found or False otherwise.""” def recurse(node): return node != None and / (node.data == target or / (node.data > target and recurse(node.left)) or / recurse(node.right)) return recurse(self._root) Method contains Alternatively, for the logically intoxicated...

def preorder(self): """Supports a preorder traversal on a view of self.""" lyst = list() def recurse(node): if node != None: lyst.append(node.data) recurse(node.left) recurse(node.right) recurse(self._root) return iter(lyst) Preorder Traversal A traversal builds and returns a list of items in the order in which they were visited

def __iter__(self): """Supports a preorder traversal on a view of self.""" return self.preorder() iter – First Attempt The iterator captures a preorder traversal However, this implementation would incur linear running time and linear growth of memory before the caller ever accesses an item

If the tree is not empty Create a new stack Push the root node onto the stack While the stack is not empty Pop the top node and yield its data If the node’s right subtree is not empty Push the right subtree onto the stack If the node’s left subtree is not empty Push the left subtree onto the stack iter – Second Attempt Visits the nodes in preorder, yielding the datum in each node What is the running time and growth of memory?

B F A D G Adding Items to a BST New items are always added to the frontier of the tree, as leaf nodes

Case 1: The Tree is Empty Set the root to a new node containing the item

Case 2: The Tree Is Not Empty Search for the proper place for the new node B F A D G E

Case 2: The Tree Is Not Empty Search for the proper place for the new node B F A D G E

Case 2: The Tree Is Not Empty Search for the proper place for the new node B F A D G E

def add(self, item): """Adds item to self.""" # Tree is empty, so new item goes at the root if self.isEmpty(): self._root = BSTNode(item) # Otherwise, search for the item's spot else: recurse(self._root) self._size += 1 Method add Define a helper function recurse to perform the search for the new item’s place in a non-empty tree

def add(self, item): """Adds item to self.""" def recurse(node): # New item is less, go left until spot is found if item < node.data: if node.left is None: node.left = BSTNode(item) else: recurse(node.left) # New item is >=, go right until spot is found elif node.right is None: node.right = BSTNode(item) else: recurse(node.right) # Tree is empty, so new item goes at the root if self.isEmpty(): self._root = BSTNode(item) # Otherwise, search for the item's spot else: recurse(self._root) self._size += 1 Method add

def __str__(self): def recurse(node, level): s = "" if node != None: s += recurse(node.right, level + 1) s += "| " * level s += str(node.data) + "\n" s += recurse(node.left, level + 1) return s return recurse(self._root, 0) Method str Displays the tree rotated 90  counterclockwise

tree = LinkedBST() print(">>>>Items in advantageous order:") tree.add("E") tree.add("C") tree.add("D") tree.add("A") tree.add("H") tree.add("F") tree.add("K") print(tree) Adding Items in Best Order

print(">>>>Items in worst order:") tree = LinkedBST() for i in range(1, 9): tree.add(i) print(tree) Adding Items in Worst Order

print(">>>>Items in random order:") tree = LinkedBST() for i in range(7): tree.add(randomString()) print(tree) Adding Items in Random Order

Performance FDCABEGABCDEFG Worst Best

The Shape of the Tree As the tree becomes linear, searches and insertions degrade to linear A BST can be rebalanced in linear time Alternatively, a BST can be set up to maintain its balance during insertions

For Friday Parsing Expressions with Recursive Descent