CS261 ¡– ¡Data ¡Structures ¡ CS ¡261 ¡– ¡Data ¡Structures ¡ Binary ¡Tree ¡Iterator ¡
Recursive ¡Traversal ¡ ¡ ¡ void ¡inorder(struct ¡Node ¡*node) ¡{ ¡ ¡ ¡ ¡if ¡(node ¡!= ¡0){ ¡ ¡ ¡ ¡ ¡ ¡inorder(node-‑>le9); ¡ ¡ ¡ ¡ ¡ ¡process ¡(node-‑>val); ¡ ¡ ¡ ¡ ¡ ¡inorder(node-‑>rght); ¡ Robert ¡ ¡ ¡ ¡} ¡ ¡} ¡ Gabby ¡ Sam ¡ ¡ ¡ Abigail ¡ Kate ¡ ¡ ¡ Dave ¡ ¡
Goals ¡ • In-‑Order ¡traversal ¡that ¡supports ¡the ¡Iterator ¡ Interface ¡ ¡(HasNext, ¡Next) ¡ – Concepts ¡ – ImplementaLon ¡ ¡
Simple ¡Iterator ¡ • Simple ¡iterator ¡ à ¡recursively ¡traverse ¡tree, ¡ placing ¡all ¡node ¡values ¡into ¡a ¡linked ¡list, ¡then ¡ use ¡a ¡linked ¡list ¡iterator ¡ • Problem: ¡duplicates ¡data, ¡uses ¡twice ¡as ¡much ¡ space ¡ • Can ¡we ¡do ¡beQer? ¡
Exercise ¡ ¡ ¡What ¡is ¡being ¡stored ¡in ¡the ¡process ¡stack? ¡ ¡ void ¡inorder(struct ¡Node ¡*node) ¡{ ¡ ¡ ¡ ¡if ¡(node ¡!= ¡0){ ¡ ¡ ¡ ¡ ¡ ¡inorder(node-‑>le9); ¡ ¡ ¡ ¡ ¡ ¡process ¡(node-‑>val); ¡ Robert ¡ ¡ ¡ ¡ ¡ ¡inorder(node-‑>rght); ¡ ¡ ¡ ¡} ¡ Gabby ¡ Sam ¡ ¡} ¡ ¡ ¡ Abigail ¡ Kate ¡ ¡ ¡ Dave ¡ ¡
Exercise ¡ ¡ void ¡inorder(struct ¡Node ¡*node) ¡{ ¡ Robert ¡ ¡ ¡ ¡ ¡if ¡(node ¡!= ¡0){ ¡ ¡ ¡ ¡ ¡ ¡inorder(node-‑>le9); ¡ ¡ ¡ ¡ ¡ ¡ ¡process ¡(node-‑>val); ¡ Gabby ¡ Sam ¡ ¡ ¡ ¡ ¡ ¡inorder(node-‑>rght); ¡ ¡ ¡ ¡ ¡} ¡ ¡ Abigail ¡ Kate ¡ ¡} ¡ ¡ When ¡Process ¡Abigail: ¡ ¡ ¡ ¡Robert ¡ InOrder ¡Robert ¡ Dave ¡ ¡ ¡ ¡Gabby ¡ ¡InOrder ¡Gabby ¡ ¡Abigail ¡ ¡ ¡ ¡ ¡InOrder ¡Abigail ¡ are ¡all ¡unfinished! ¡ ¡ ¡ ¡ ¡ ¡InOrder ¡NULL ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Process ¡Abigail ¡ Process ¡Stack ¡represents ¡a ¡ ¡ When ¡Process ¡Dave ¡ When ¡Process ¡Gabby ¡ ¡ ¡ ¡InOrder ¡Dave ¡ ¡Robert ¡ path ¡to ¡ ¡Robert ¡ ¡ ¡ ¡ ¡InOrder ¡NULL ¡ ¡Gabby ¡ ¡Gabby ¡ ¡ ¡ ¡ ¡Process ¡Dave ¡ ¡Abigail ¡ ¡ the ¡leYmost ¡ ¡unprocessed ¡ are ¡all ¡unfinished! ¡ ¡ ¡ ¡ ¡InOrder ¡NULL ¡ ¡Dave ¡ node!! ¡ ¡ ¡Process ¡Gabby ¡ are ¡all ¡unfinished! ¡ ¡ ¡InOrder ¡Kate ¡
SoluLon ¡ à ¡Replace ¡Process ¡Stack ¡ • Simulate ¡recursion ¡using ¡a ¡stack ¡ • Stack ¡path ¡as ¡we ¡traverse ¡down ¡to ¡the ¡leYmost ¡ element ¡ (smallest ¡in ¡BST) ¡ • Useful ¡rouLne: ¡ ¡void ¡_slideLe9(struct ¡Stack ¡*stk, ¡struct ¡Node ¡*n) ¡ ¡ ¡ ¡ ¡while ¡(n ¡!= ¡0) ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡pushStack(stk, ¡n); ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡n ¡= ¡n-‑>le9; ¡ ¡ ¡ ¡ ¡} ¡ ¡} ¡
Binary ¡Tree ¡In-‑Order ¡Iterator ¡ ¡ • Main ¡Idea ¡ – Next ¡returns ¡the ¡top ¡of ¡the ¡stack ¡(e.g. ¡the ¡next ¡ element ¡you’ll ¡go ¡UNDER ¡in ¡Euler ¡Tour) ¡ – HasNext ¡ ¡ • Returns ¡true ¡if ¡there ¡are ¡elements ¡leY ¡(on ¡stack) ¡to ¡ iterate ¡ • Sets ¡up ¡the ¡subsequent ¡call ¡to ‘ Next() ’ by ¡making ¡sure ¡ the ¡leYmost ¡node ¡(smallest ¡in ¡BST) ¡element ¡is ¡on ¡top ¡of ¡ the ¡stack. ¡ ¡It ¡does ¡this ¡by ¡calling ¡_slideLeY ¡on ¡the ¡ node’s ¡right ¡child ¡
BST ¡In-‑Order ¡Iterator: ¡ Algorithm ¡ ¡IniLalize: ¡create ¡an ¡empty ¡stack ¡ ¡hasNext: ¡ ¡ ¡ ¡if ¡stack ¡is ¡empty ¡perform ¡slide ¡leY ¡on ¡root ¡ ¡ ¡ ¡ ¡otherwise ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡let ¡n ¡be ¡top ¡of ¡stack ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡pop ¡n ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡slide ¡leY ¡on ¡right ¡child ¡of ¡n ¡ ¡ ¡ ¡return ¡true ¡if ¡stack ¡is ¡not ¡empty ¡ (false ¡otherwise) ¡ ¡next: ¡ ¡ ¡return ¡value ¡of ¡node ¡on ¡top ¡of ¡stack ¡ (but ¡don ’ t ¡pop ¡node) ¡
In-‑Order ¡EnumeraLon: ¡ Sliding ¡LeY ¡ Stack ¡holds ¡the ¡path ¡to ¡the ¡leYmost ¡node ¡=> ¡next ¡node ¡ ¡ you ¡can ¡go ¡UNDER ¡=> ¡path ¡to ¡the ¡next ¡smallest ¡element ¡ ¡ in ¡a ¡BST ¡
In-‑Order ¡Iterator: ¡ SimulaLon ¡ 10 ¡ 10 ¡ On ¡stack ¡(lowest ¡node ¡at ¡top). ¡ 5 ¡ 9 ¡ 5 ¡ 9 ¡ Not ¡yet ¡visited. ¡ 1 ¡ 4 ¡ 8 ¡ 1 ¡ 4 ¡ 8 ¡ Enumerated ¡(order ¡indicated). ¡ 3 ¡ 6 ¡ 7 ¡ 3 ¡ 6 ¡ 7 ¡ IniLalized ¡in ¡hasNext() ¡ next, ¡hasNext ¡ ¡ ¡ ¡ slideLe9 ¡ ¡ ¡ 2 ¡ 2 ¡ 10 ¡ 10 ¡ 10 ¡ 2 ¡ 9 ¡ 2 ¡ 9 ¡ 2 ¡ 9 ¡ 1 ¡ 4 ¡ 8 ¡ 1 ¡ 4 ¡ 8 ¡ 1 ¡ 4 ¡ 8 ¡ 3 ¡ 6 ¡ 7 ¡ 3 ¡ 6 ¡ 7 ¡ 4 ¡ 6 ¡ 7 ¡ next, ¡hasNext ¡ next, ¡hasNext ¡ next, ¡hasNext ¡ ¡ ¡ ¡pop, ¡ slideLe9 ¡ ¡ ¡pop ¡ ¡ ¡ ¡pop ¡ 2 ¡ 3 ¡ 3 ¡
In-‑Order ¡Iterator: ¡ ¡ SimulaLon ¡ 6 ¡ 10 ¡ On ¡stack ¡(lowest ¡node ¡at ¡top). ¡ 2 ¡ 9 ¡ 2 ¡ 9 ¡ Not ¡yet ¡visited. ¡ 1 ¡ 5 ¡ 8 ¡ 1 ¡ 5 ¡ 8 ¡ Enumerated ¡(order ¡indicated). ¡ 4 ¡ 6 ¡ 7 ¡ 4 ¡ 6 ¡ 7 ¡ next,hasNext ¡ next,hasNext ¡ ¡ ¡ ¡pop ¡ ¡ ¡ ¡pop, ¡ slideLe9 ¡ 3 ¡ 3 ¡ 6 ¡ 6 ¡ 6 ¡ 2 ¡ 7 ¡ 2 ¡ 7 ¡ 2 ¡ 7 ¡ 1 ¡ 5 ¡ 8 ¡ 1 ¡ 5 ¡ 9 ¡ 1 ¡ 5 ¡ 9 ¡ 4 ¡ 6 ¡ 7 ¡ 4 ¡ 8 ¡ 10 ¡ 4 ¡ 8 ¡ 10 ¡ next,hasNext() ¡ next,hasNext ¡ next,hasNext ¡ ¡ ¡ ¡pop, ¡ slideLe9 ¡ ¡ ¡ ¡pop ¡ next,hasNext ¡ 3 ¡ 3 ¡ 3 ¡
BST ¡In-‑Order ¡Iterator: ¡ Algorithm ¡ ¡IniLalize: ¡create ¡an ¡empty ¡stack ¡ ¡hasNext: ¡ ¡ ¡ ¡if ¡stack ¡is ¡empty ¡perform ¡slide ¡leY ¡on ¡root ¡ ¡ ¡ ¡ ¡otherwise ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡let ¡n ¡be ¡top ¡of ¡stack ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡pop ¡n ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡slide ¡leY ¡on ¡right ¡child ¡of ¡n ¡ ¡ ¡ ¡return ¡true ¡if ¡stack ¡is ¡not ¡empty ¡ (false ¡otherwise) ¡ ¡next: ¡ ¡ ¡return ¡value ¡of ¡node ¡on ¡top ¡of ¡stack ¡ (but ¡don ’ t ¡pop ¡node) ¡
Complexity? ¡ • Each ¡nodes ¡goes ¡on ¡the ¡stack ¡exactly ¡one ¡Lme ¡ • Each ¡node ¡is ¡popped ¡off ¡the ¡stack ¡exactly ¡one ¡ Lme ¡ • ¡O(N) ¡
Other ¡Traversals ¡ • Pre-‑order ¡and ¡post-‑order ¡traversals ¡also ¡use ¡a ¡ stack ¡ • See ¡Chapter ¡10 ¡discussion ¡
Level-‑Order ¡IteraLon ¡ ¡Haven’t ¡seen ¡this ¡traversal ¡ yet: ¡ p ¡ – Traverse ¡nodes ¡a ¡level ¡at ¡a ¡ Lme ¡from ¡leY ¡to ¡right ¡ s ¡ e ¡ – Start ¡with ¡root ¡level ¡and ¡then ¡ traverse ¡its ¡children ¡and ¡then ¡ their ¡children ¡and ¡so ¡on ¡ a ¡ m ¡ r ¡ l ¡ – ImplementaLon? ¡ a ¡ e ¡ t ¡ ¡ e ¡ ¡Example ¡result: ¡p ¡s ¡e ¡a ¡m ¡l ¡r ¡a ¡t ¡e ¡e ¡
Your ¡Turn ¡ ¡Complete ¡Worksheet ¡#30: ¡BST ¡Iterator ¡
Recommend
More recommend