Try   HackMD

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

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

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