Tree Traversals reminder Breadthfirst traversal starting from root
Tree Traversals – reminder Breadth-first traversal: • starting from root, visit all nodes on each level in turn, from left to right Depth-first traversals: • Preorder: visit root, traverse left, traverse right – General case: visit root, then traverse subtrees L R • Postorder: traverse left, traverse right, visit root – General case: traverse subtrees L R, then visit root • Inorder: traverse left, visit root, traverse right COSC 2 P 03 Week 2 1
Binary Preorder Traversal • Visit root, traverse left subtree, traverse right subtree pre. Order. Traverse(Binary. Node T) { if(T == null) // base case return; else // recursive case - 2 recursive calls { T. display. Node(); pre. Order. Traverse(T. left); pre. Order. Traverse(T. right); } } COSC 2 P 03 Week 3 2
Binary Postorder Traversal • Traverse left subtree, traverse right subtree, visit root post. Order. Traverse(Binary. Node T) { if(T == null) return; else { post. Order. Traverse(T. left); post. Order. Traverse(T. right); T. display. Node(); } } COSC 2 P 03 Week 3 3
Inorder Traversal • Traverse left subtree, visit root, traverse right subtree in. Order. Traverse(Binary. Node T) { if(T == null) return; else { in. Order. Traverse(T. left); T. display. Node(); in. Order. Traverse(T. right); } } COSC 2 P 03 Week 3 4
Height of a Tree Idea: use a postorder traversal, since we first need the heights of the subtrees int height(Binary. Node T) { if(T == null) return – 1; else return 1 + max(height(T. left), height(T. right)); } COSC 2 P 03 Week 3 5
Preorder Iterative Traversal • Use an initially-empty stack, TS, of type Binary. Node pre. Order. Iterative. Traverse(Binary. Node T) { while(T != null) { T. display. Node(); /* after left subtree, need to go to right subtree: so save it on stack */ if(T. right != null) TS. push(T. right); /* now traverse left subtree if it exists */ if(T. left != null) T = T. left; /* else go to next node in preorder, which is at top of stack */ else if(!TS. is. Empty()) T = TS. pop(); else // traversal is finished T = null; } COSC 2 P 03 Week 3 6 }
Binary Search Trees – Search (Iterative version) Binary. Node find(Binary. Node T, int key) // find the node with the given key { curr = T; while(curr. info != key) { if(key < curr. info) curr = curr. left; else curr = curr. right; if(curr == null) // not found return null; } return curr; } COSC 2 P 03 Week 3 7
Binary Search Trees – find. Min (Iterative version) Binary. Node find. Min(Binary. Node T) // find smallest element { if(T != null) { while(T. left != null) T = T. left; } return T; } COSC 2 P 03 Week 3 8
Binary Search Trees – find. Max (Recursive version) Binary. Node find. Max(Binary. Node T) // find largest element { if(T == null) // base case return null; else if(T. right == null) // base case return T; return find. Max(T. right); // makes progress } COSC 2 P 03 Week 3 9
Binary Search Trees – Insert (iterative) void insert(Binary. Node T, Binary. Node new. Node) // insert new. Node into tree with root T { if(T == null) T = new. Node; else { curr = T; while(true) { parent = curr; if(new. Node. info < curr. info) // insert { curr = curr. left; if(curr == null) // insert { parent. left = new. Node; return; } } else // insert { curr = curr. right; if(curr == null) // insert { parent. right = new. Node; return; COSC 2 P 03 Week 3 } } } in left subtree here in right subtree here 10
Binary Search Trees – Delete (see Weiss, section 4. 3) Binary. Node delete(int key) // delete and return node with given key { Search for node with given key; If no children just delete Else if no right child replace with left subtree Else if no left child replace with right subtree Else (2 children) replace with inorder successor } COSC 2 P 03 Week 3 11
- Slides: 11