# 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

##### 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`