binarytreeIterator: stack, prevn ctor(tree): if tree == null: throw stack = new prevn = null if tree.root != null: stack.push(tree.root) bool hasnext(): return stack.any() //O(n) bool isVisited(n, visited): return visited.has(n) //O(1), and O(logn) due to stack bool isVisited(n, prevn): return prevn == n // pre-order x current(): if stack.isEmpty(): throw "empty" n = stack.pop() if n.right != null: stack.push(n.right) if n.left != null: stack.push(n.left) return n.value // in-order x current(): if stack.isempty(): throw "empty" while stack.any(): n, isVisited = stack.pop() if !isVisited && n.left != null: stack.push(n, isVisited: true) stack.push(n.left, isVisited: false) continue if n.right != null: stack.push(n.right, isVisited: false) return n // post-order x current(): if stack.isEmpty(): throw "empty" while stack.any(): n = stack.pop() if n.left != null && !isVisited(n.left, prevn) && !isVisited(n.right, prevn): stack.push(n) stack.push(n.left) continue if n.right != null && !isVisited(n.right, prevn): stack.push(n) stack.push(n.right) continue prevn = n return n.value throw "invalid op"[Hat tip to J]
Saturday, March 24, 2018
binary tree iterators
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment