# [LeetCode] 144. Binary Tree Preorder Traversal 二叉树的先序遍历

2021年09月15日 阅读数：1

Given a binary tree, return the preorder traversal of its nodes' values.html

For example:
Given binary tree `{1,#,2,3}`,node

```   1
\
2
/
3
```

return `[1,2,3]`.python

Note: Recursive solution is trivial, could you do it iteratively?app

1. 用迭代和stack。2. Morris Traversal Solutionhtm

Python: Stack,  Time: O(n), Space: O(h) # h is the height of the treeblog

```class Solution2(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
result, stack = [], [(root, False)]
while stack:
root, is_visited = stack.pop()
if root is None:
continue
if is_visited:
result.append(root.val)
else:
stack.append((root.right, False))
stack.append((root.left, False))
stack.append((root, True))
return result
```

Python: Morris， Time: O(n), Space: O(1)递归

```class Solution(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
result, curr = [], root
while curr:
if curr.left is None:
result.append(curr.val)
curr = curr.right
else:
node = curr.left
while node.right and node.right != curr:
node = node.right

if node.right is None:
result.append(curr.val)
node.right = curr
curr = curr.left
else:
node.right = None
curr = curr.right

return result　　```