F
/ \
B G
/ \ \
A D I
/ \ /
C E H
Pre-order Traversal
root left subtree right subtree
F B A D C E G I H
https://leetcode.com/problems/binary-tree-preorder-traversal/
Iterative approach
class Solution(object):
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
"""
:type root: TreeNode
:rtype: List[int]
"""
res, stack = [], [(root, False)]
while stack:
node, visited = stack.pop()
if node:
if visited:
res.append(node.val)
else:
stack.append((node.right, False))
stack.append((node.left, False))
stack.append((node, True))
return res
Recursive solution
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
if root is None:
return []
return [root.val] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right)
In-order Traversal
left subtree root right subtree
A B C D E F G H I
https://leetcode.com/problems/binary-tree-inorder-traversal/
Iterative approach
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
res, stack = [], [(root, False)]
while stack:
node, visited = stack.pop()
if node:
if visited:
res.append(node.val)
else:
stack.append((node.right, False))
stack.append((node, True))
stack.append((node.left, False))
return res
Recursive solution
Post-order Traversal
left subtree right subtree root
A C E D B H I G F
Iterative approach
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
res, stack = [], [(root, False)]
while stack:
node, visited = stack.pop()
if node:
if visited:
res.append(node.val)
else:
stack.append((node, True))
stack.append((node.right, False))
stack.append((node.left, False))
return res
Recursive solution