Skip to content

Instantly share code, notes, and snippets.

@potatowagon
Last active October 17, 2021 17:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save potatowagon/2f7909be245120871824ea2f210c9898 to your computer and use it in GitHub Desktop.
Save potatowagon/2f7909be245120871824ea2f210c9898 to your computer and use it in GitHub Desktop.
binary tree iterative traversal

Inorder

Left, Root, Right https://leetcode.com/problems/binary-tree-inorder-traversal/

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        stack = []
        node = root
        ans = []
        while stack or node:
            while node:
                stack.append(node)
                node = node.left
            node = stack.pop()
            ans.append(node.val)
            node = node.right
        return ans

Preorder

Root, Left, Right https://leetcode.com/problems/binary-tree-preorder-traversal

class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        stack = [root]
        ans = []
        while stack:
            node = stack.pop()
            if node: 
                ans.append(node.val)
                stack.append(node.right)
                stack.append(node.left)
        return ans

Postorder

Left, Right, Root https://leetcode.com/problems/binary-tree-postorder-traversal/ modified postorder and reverse results

class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        ans = []
        stack = [root]
        while stack:
            # modified preorder: root, right, left
            node = stack.pop()
            if node:
                ans.append(node.val)
                stack.append(node.left)
                stack.append(node.right)
                
        return ans[::-1]

using a visited flag

class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        ans = []
        stack = [(root, False)] # node, visited
        
        while stack:
            node, visited = stack.pop()
            if node:
                if visited:
                    ans.append(node.val)
                else:
                    stack.append((node, True))
                    stack.append((node.right, False))
                    stack.append((node.left, False))
        return ans
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment