# 144. Binary Tree Preorder Traversal #### Difficulty: Easy link: https://leetcode.com/problems/binary-tree-preorder-traversal/ ### 1. Recursive method #### $O(n)$ runtime, $O(n)$ space ##### python ```python= # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: result = [] def preorder(node): if node is not None: result.append(node.val) preorder(node.left) preorder(node.right) preorder(root) return result ``` ### 2. Iterative method with Stack #### $O(n)$ runtime, $O(n)$ space ##### python ```python= # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: stack, result = [], [] node = root while True: while node is not None: result.append(node.val) stack.append(node) node = node.left if not stack: return result node = stack.pop() node = node.right ``` ##### python ```python= # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: stack, result = [root], [] while stack: node = stack.pop() if node is not None: result.append(node.val) stack.append(node.right) stack.append(node.left) return result ``` ### 3. Morris Traversal #### $O(n)$ runtime, $O(1)$ space ![](https://i.imgur.com/851sKnz.png) ##### python ```python= # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: result = [] node = root while node is not None: if node.left is None: result.append(node.val) node = node.right else: # Find the inorder predecessor of current node pred = node.left while pred.right is not None and pred.right is not node: pred = pred.right # If the right child of inorder predecessor already points to # the current node, restore the original tree and update the # current node to it's right child if pred.right is node: pred.right = None node = node.right # Make current node as right child of its inorder predecessor else: result.append(node.val) pred.right = node node = node.left return result ``` Ref: https://www.796t.com/content/1545897069.html ###### tags: `leetcode`