Building Java Programs Chapter 17 Binary Trees. 2 Creative use of arrays/links Some data structures (such as hash tables and binary trees) are built around.

Slides:



Advertisements
Similar presentations
Chapter 7. Binary Search Trees
Advertisements

CSE 143 Lecture 18 Binary Trees read slides created by Marty Stepp and Hélène Martin
CSE 143 Lecture 17 Binary Search Trees and Comparable slides created by Ethan Apter
CSE 143 Lecture 19 Binary Trees read slides created by Marty Stepp
CS 206 Introduction to Computer Science II 02 / 11 / 2009 Instructor: Michael Eckmann.
CSE 143 Lecture 19 Binary Search Trees read 17.3 slides created by Marty Stepp
Building Java Programs Binary Search Trees reading: 17.3 – 17.4.
Version TCSS 342, Winter 2006 Lecture Notes Trees Binary Trees Binary Search Trees.
Properties: -Each node has a value -The left subtree contains only values less than the parent node’s value -The right subtree contains only values greater.
Data Structures - CSCI 102 Binary Tree In binary trees, each Node can point to two other Nodes and looks something like this: template class BTNode { public:
Nirmalya Roy School of Electrical Engineering and Computer Science Washington State University Cpt S 122 – Data Structures Templatized Tree.
1 Trees Tree nomenclature Implementation strategies Traversals –Depth-first –Breadth-first Implementing binary search trees.
Lecture Objectives  To learn how to use a tree to represent a hierarchical organization of information  To learn how to use recursion to process trees.
Building Java Programs Binary Search Trees; TreeSet.
CSE 143 Lecture 20 Binary Search Trees continued; Tree Sets read slides created by Marty Stepp and Hélène Martin
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,
Lecture 10 Trees –Definiton of trees –Uses of trees –Operations on a tree.
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.
CSE 143 Lecture 18 Binary Trees read slides created by Marty Stepp
Binary Search Trees Nilanjan Banerjee. 2 Goal of today’s lecture Learn about Binary Search Trees Discuss the first midterm.
CSE 143 Lecture 22 Binary Search Trees continued; Tree Sets read slides adapted from Marty Stepp and Hélène Martin
Building Java Programs Binary Trees reading: 17.1 – 17.3.
CSE 143 Lecture 21 Binary Search Trees, continued read slides created by Marty Stepp
ADT Binary Search Tree Ellen Walker CPSC 201 Data Structures Hiram College.
TREES K. Birman’s and G. Bebis’s Slides. Tree Overview 2  Tree: recursive data structure (similar to list)  Each cell may have zero or more successors.
CSE 143 Lecture 19 Binary Trees read slides created by Marty Stepp
BINARY TREES Objectives Define trees as data structures Define the terms associated with trees Discuss tree traversal algorithms Discuss a binary.
CSE 373 Data Structures and Algorithms Lecture 9: Set ADT / Trees.
CSE 143 Lecture 20 Binary Search Trees read 17.3 slides created by Marty Stepp
Lecture 19: Binary Trees reading: 17.1 – 17.3
CSE 143 Lecture 20 Binary Search Trees continued; Tree Sets
CSE 373 Binary search trees; tree height and balance
Recursive Objects (Part 4)
Building Java Programs
Binary Search Tree (BST)
Binary Trees "The best time to plant a tree is twenty years ago. The second best time is now." -Chinese proverb Real programmmers always confuse Christmas.
Trees.
Data Structures & Algorithm Design
Binary Search Trees.
Map interface Empty() - return true if the map is empty; else return false Size() - return the number of elements in the map Find(key) - if there is an.
Building Java Programs
Building Java Programs Chapter 17
Rick Mercer, Allison Obourn, Marty Stepp
slides created by Marty Stepp and Alyssa Harding
Building Java Programs
slides created by Alyssa Harding
Find in a linked list? first last 7  4  3  8 NULL
Binary Trees Based on slides by Alyssa Harding & Marty Stepp
CSE 373: Data Structures and Algorithms
CSE 143 Lecture 20 Binary Search Trees, continued read 17.3
Building Java Programs
Building Java Programs
CSE 373: Data Structures and Algorithms
Design and Analysis of Algorithms
Data Structures and Algorithms
Binary Search Trees continued; Tree Sets
Lecture 21: Binary Search Trees; TreeSet
slides created by Alyssa Harding
CSE 143 Lecture 25 Set ADT implementation; hashing read 11.2
CSE 373 Data Structures and Algorithms
Building Java Programs
BINARY TREE CSC248 – Data Structure.
Building Java Programs
Building Java Programs
Lecture 21: Binary Search Trees; TreeSet
Binary Search Trees reading: 17.3 – 17.4
Hashing based on slides by Marty Stepp
Trees.
Lecture 9: Intro to Trees
Binary Search Trees Based on slides by Marty Stepp & Alyssa Harding
Presentation transcript:

Building Java Programs Chapter 17 Binary Trees

2 Creative use of arrays/links Some data structures (such as hash tables and binary trees) are built around clever ways of using arrays and/or linked lists. –What array order can help us find values quickly later? –What if linked list nodes each had more than one link? index value front back

3 Trees tree: A directed, acyclic structure of linked nodes. –directed : Has one-way links between nodes. –acyclic : No path wraps back around to the same node twice. –binary tree: One where each node has at most two children. A tree can be defined as either: –empty ( null ), or –a root node that contains: data, a left subtree, and a right subtree. –(The left and/or right subtree could be empty.) root

4 Trees in computer science folders/files on a computer family genealogy; organizational charts AI: decision trees compilers: parse tree –a = (b + c) * d; cell phone T9 d+ *a = cb

5 Programming with trees Trees are a mixture of linked lists and recursion –considered very elegant (perhaps beautiful!) by CSE nerds –difficult for novices to master Common student remark #1: –"My code doesn't work, and I don't know why." Common student remark #2: –"My code works, and I don't know why."

6 Terminology node: an object containing a data value and left/right children root: topmost node of a tree leaf: a node that has no children branch: any internal node; neither the root nor a leaf parent: a node that refers to this one child: a node that this node refers to sibling: a node with a common root

7 Terminology 2 subtree: the tree of nodes reachable to the left/right from the current node height: length of the longest path from the root to any node level or depth: length of the path from a root to a given node full tree: one where every branch has 2 children root height = 3 level 1 level 2 level 3

8 A tree node for integers A basic tree node object stores data and refers to left/right Multiple nodes can be linked together into a larger tree leftdataright 42 leftdataright 42 leftdataright 59 leftdataright 27 leftdataright 86

9 IntTreeNode class // An IntTreeNode object is one node in a binary tree of ints. public class IntTreeNode { public int data; // data stored at this node public IntTreeNode left; // reference to left subtree public IntTreeNode right; // reference to right subtree // Constructs a leaf node with the given data. public IntTreeNode(int data) { this(data, null, null); } // Constructs a branch node with the given data and links. public IntTreeNode(int data, IntTreeNode left, IntTreeNode right) { this.data = data; this.left = left; this.right = right; }

10 IntTree class // An IntTree object represents an entire binary tree of ints. public class IntTree { private IntTreeNode overallRoot; // null for an empty tree methods } –Client code talks to the IntTree, not to the node objects inside it –Methods of the IntTree create and manipulate the nodes, their data and links between them overallRoot

11 IntTree constructor Assume we have the following constructors: public IntTree(IntTreeNode overallRoot) public IntTree(int height) –The 2nd constructor will create a tree and fill it with nodes with random data values from until it is full at the given height. IntTree tree = new IntTree(3); overallRoot

12 Exercise Add a method print to the IntTree class that prints the elements of the tree, separated by spaces. –A node's left subtree should be printed before it, and its right subtree should be printed after it. –Example: tree.print(); overallRoot

13 Exercise solution // An IntTree object represents an entire binary tree of ints. public class IntTree { private IntTreeNode overallRoot; // null for an empty tree... public void print() { print(overallRoot); System.out.println(); // end the line of output } private void print(IntTreeNode root) { // (base case is implicitly to do nothing on null) if (root != null) { // recursive case: print left, center, right print(overallRoot.left); System.out.print(overallRoot.data + " "); print(overallRoot.right); }

14 Template for tree methods public class IntTree { private IntTreeNode overallRoot;... public type name ( parameters ) { name(overallRoot, parameters ); } private type name (IntTreeNode root, parameters ) {... } Tree methods are often implemented recursively –with a public/private pair –the private version accepts the root node to process

15 Traversals traversal: An examination of the elements of a tree. –A pattern used in many tree algorithms and methods Common orderings for traversals: –pre-order:process root node, then its left/right subtrees –in-order:process left subtree, then root node, then right –post-order:process left/right subtrees, then root node overallRoot

16 Traversal example pre-order: in-order: post-order: overallRoot

17 Traversal trick To quickly generate a traversal: –Trace a path around the tree. –As you pass a node on the proper side, process it. pre-order: left side in-order: bottom post-order: right side pre-order: in-order: post-order: overallRoot

18 Give pre-, in-, and post-order traversals for the following tree: –pre: –in: –post: Exercise overallRoot

19 Exercise Add a method named printSideways to the IntTree class that prints the tree in a sideways indented format, with right nodes above roots above left nodes, with each level 4 spaces more indented than the one above it. –Example: Output from the tree below: overall root

20 Exercise solution // Prints the tree in a sideways indented format. public void printSideways() { printSideways(overallRoot, ""); } private void printSideways(IntTreeNode root, String indent) { if (root != null) { printSideways(root.right, indent + " "); System.out.println(indent + root.data); printSideways(root.left, indent + " "); }

21 Binary search trees binary search tree ("BST"): a binary tree that is either: –empty ( null ), or –a root node R such that: every element of R's left subtree contains data "less than" R's data, every element of R's right subtree contains data "greater than" R's, R's left and right subtrees are also binary search trees. BSTs store their elements in sorted order, which is helpful for searching/sorting tasks overall root

22 Exercise Which of the trees shown are legal binary search trees? xk qg m e b

23 Searching a BST Describe an algorithm for searching the tree below for the value 31. Then search for the value 6. What is the maximum number of nodes you would need to examine to perform any search? overall root

24 Exercise Convert the IntTree class into a SearchTree class. –The elements of the tree will constitute a legal binary search tree. Add a method contains to the SearchTree class that searches the tree for a given integer, returning true if found. –If a SearchTree variable tree referred to the tree below, the following calls would have these results: tree.contains(29)  true tree.contains(55)  true tree.contains(63)  false tree.contains(35)  false overall root

25 Exercise solution // Returns whether this tree contains the given integer. public boolean contains(int value) { return contains(overallRoot, value); } private boolean contains(IntTreeNode root, int value) { if (root == null) { return false; } else if (root.data == value) { return true; } else if (root.data > value) { return contains(root.left, value); } else { // root.data < value return contains(root.right, value); }

26 Adding to a BST Suppose we want to add the value 14 to the BST below. –Where should the new node be added? Where would we add the value 3? Where would we add 7? If the tree is empty, where should a new value be added? What is the general algorithm?

27 Adding exercise Draw what a binary search tree would look like if the following values were added to an initially empty tree in this order:

28 Exercise Add a method add to the SearchTree class that adds a given integer value to the tree. Assume that the elements of the SearchTree constitute a legal binary search tree, and add the new value in the appropriate place to maintain ordering. tree.add(49) ; overall root 49

29 An incorrect solution // Adds the given value to this BST in sorted order. public void add(int value) { add(overallRoot, value); } private void add(IntTreeNode root, int value) { if (root == null) { root = new IntTreeNode(value); } else if (root.data > value) { add(root.left, value); } else if (root.data < value) { add(root.right, value); } // else root.data == value; // a duplicate (don't add) } Why doesn't this solution work? overallRoot

30 The problem Much like with linked lists, if we just modify what a local variable refers to, it won't change the collection. private void add(IntTreeNode root, int value) { if (root == null) { root = new IntTreeNode(value); } –In the linked list case, how did we actually modify the list? by changing the front by changing a node's next field overallRoot 49 root

31 A poor correct solution // Adds the given value to this BST in sorted order. (bad style) public void add(int value) { if (overallRoot == null) { overallRoot = new IntTreeNode(value); } else if (overallRoot.data > value) { add(overallRoot.left, value); } else if (overallRoot.data < value) { add(overallRoot.right, value); } // else overallRoot.data == value; a duplicate (don't add) } private void add(IntTreeNode root, int value) { if (root.data > value) { if (root.left == null) { root.left = new IntTreeNode(value); } else { add(overallRoot.left, value); } } else if (root.data < value) { if (root.right == null) { root.right = new IntTreeNode(value); } else { add(overallRoot.right, value); } // else root.data == value; a duplicate (don't add) }

32 x = change(x); String methods that modify a string actually return a new one. –If we want to modify a string variable, we must re-assign it. String s = "lil bow wow"; s.toUpperCase(); System.out.println(s); // lil bow wow s = s.toUpperCase(); System.out.println(s); // LIL BOW WOW –We call this general algorithmic pattern x = change(x); –We will use this approach when writing methods that modify the structure of a binary tree.

33 Applying x = change(x) Methods that modify a tree should have the following pattern: –input (parameter):old state of the node –output (return):new state of the node In order to actually change the tree, you must reassign: root = change (root, parameters ); root.left = change (root.left, parameters ); root.right = change (root.right, parameters ); your method node before node after parameterreturn

34 A correct solution // Adds the given value to this BST in sorted order. public void add(int value) { overallRoot = add(overallRoot, value); } private IntTreeNode add(IntTreeNode root, int value) { if (root == null) { root = new IntTreeNode(value); } else if (root.data > value) { root.left = add(root.left, value); } else if (root.data < value) { root.right = add(root.right, value); } // else a duplicate return root; } Think about the case when root is a leaf overallRoot

35 Searching BSTs The BSTs below contain the same elements. –What orders are "better" for searching? overall root overall root overall root 9 7 6

36 Trees and balance balanced tree: One whose subtrees differ in height by at most 1 and are themselves balanced. –A balanced tree of N nodes has a height of ~ log 2 N. –A very unbalanced tree can have a height close to N. –The runtime of adding to / searching a BST is closely related to height. –Some tree collections (e.g. TreeSet ) contain code to balance themselves as new nodes are added overall root height = 4 (balanced)

37 Exercise Add a method getMin to the IntTree class that returns the minimum integer value from the tree. Assume that the elements of the IntTree constitute a legal binary search tree. Throw a NoSuchElementException if the tree is empty. int min = tree.getMin(); // overall root

38 Exercise solution // Returns the minimum value from this BST. // Throws a NoSuchElementException if the tree is empty. public int getMin() { if (overallRoot == null) { throw new NoSuchElementException(); } return getMin(overallRoot); } private int getMin(IntTreeNode root) { if (root.left == null) { return root.data; } else { return getMin(root.left); } overallRoot

39 Exercise Add a method remove to the IntTree class that removes a given integer value from the tree, if present. Assume that the elements of the IntTree constitute a legal binary search tree, and remove the value in such a way as to maintain ordering. tree.remove(73); tree.remove(29); tree.remove(87); tree.remove(55); overall root 73

40 Cases for removal Possible states for the node to be removed: –a leaf:replace with null –a node with a left child only:replace with left child –a node with a right child only:replace with right child –a node with both children:replace with min value from right overall root overall root tree.remove(55);

41 Exercise solution // Removes the given value from this BST, if it exists. public void remove(int value) { overallRoot = remove(overallRoot, value); } private IntTreeNode remove(IntTreeNode root, int value) { if (root == null) { return null; } else if (root.data > value) { root.left = remove(root.left, value); } else if (root.data < value) { root.right = remove(root.right, value); } else { // root.data == value; remove this node if (root.right == null) { return root.left; // no R child; replace w/ L } else if (root.left == null) { return root.right; // no L child; replace w/ R } else { // both children; replace w/ min from R root.data = getMin(root.right); root.right = remove(root.right, root.data); } return root; }

42 Binary search trees binary search tree ("BST"): a binary tree that is either: –empty ( null ), or –a root node R such that: every element of R's left subtree contains data "less than" R's data, every element of R's right subtree contains data "greater than" R's, R's left and right subtrees are also binary search trees. BSTs store their elements in sorted order, which is helpful for searching/sorting tasks overall root

43 Exercise Add a method add to the IntTree class that adds a given integer value to the tree. Assume that the elements of the IntTree constitute a legal binary search tree, and add the new value in the appropriate place to maintain ordering. tree.add(49) ; overall root 49

44 The incorrect solution public class SearchTree { private IntTreeNode overallRoot; // Adds the given value to this BST in sorted order. // (THIS CODE DOES NOT WORK PROPERLY!) public void add(int value) { add(overallRoot, value); } private void add(IntTreeNode node, int value) { if (node == null) { node = new IntTreeNode(value); } else if (value < node.data) { add(node.left, value); } else if (value > node.data) { add(node.right, value); } // else a duplicate (don't add) }

45 Applying x = change(x) Methods that modify a tree should have the following pattern: –input (parameter):old state of the node –output (return):new state of the node In order to actually change the tree, you must reassign: overallRoot = change(overallRoot,... ); node = change(node,... ); node.left = change(node.left,... ); node.right = change(node.right,... ); your method node before node after parameterreturn

46 A correct solution // Adds the given value to this BST in sorted order. public void add(int value) { overallRoot = add(overallRoot, value); } private IntTreeNode add(IntTreeNode node, int value) { if (node == null) { node = new IntTreeNode(value); } else if (value < node.data) { node.left = add(node.left, value); } else if (value > node.data) { node.right = add(node.right, value); } // else a duplicate return node; } Think about the case when root is a leaf overallRoot

47 Exercise Add a method getMin to the IntTree class that returns the minimum integer value from the tree. Assume that the elements of the IntTree constitute a legal binary search tree. Throw a NoSuchElementException if the tree is empty. int min = tree.getMin(); // overall root

48 Exercise solution // Returns the minimum value from this BST. // Throws a NoSuchElementException if the tree is empty. public int getMin() { if (overallRoot == null) { throw new NoSuchElementException(); } return getMin(overallRoot); } private int getMin(IntTreeNode root) { if (root.left == null) { return root.data; } else { return getMin(root.left); } overallRoot

49 Exercise Add a method remove to the IntTree class that removes a given integer value from the tree, if present. Assume that the elements of the IntTree constitute a legal binary search tree, and remove the value in such a way as to maintain ordering. tree.remove(73); tree.remove(29); tree.remove(87); tree.remove(55); overall root 73

50 Cases for removal 1 1.a leaf:replace with null 2.a node with a left child only:replace with left child 3.a node with a right child only:replace with right child overall root tree.remove(-3); overall root overall root 42 overall root tree.remove(55); tree.remove(29);

51 Cases for removal 2 4.a node with both children:replace with min from right overall root overall root tree.remove(55);

52 Exercise solution // Removes the given value from this BST, if it exists. public void remove(int value) { overallRoot = remove(overallRoot, value); } private IntTreeNode remove(IntTreeNode root, int value) { if (root == null) { return null; } else if (root.data > value) { root.left = remove(root.left, value); } else if (root.data < value) { root.right = remove(root.right, value); } else { // root.data == value; remove this node if (root.right == null) { return root.left; // no R child; replace w/ L } else if (root.left == null) { return root.right; // no L child; replace w/ R } else { // both children; replace w/ min from R root.data = getMin(root.right); root.right = remove(root.right, root.data); } return root; }