Left, Root, Right https://leetcode.com/problems/binary-tree-inorder-traversal/
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
stack = []
node = root
ans = []
while stack or node:
while node:
stack.append(node)
node = node.left
node = stack.pop()
ans.append(node.val)
node = node.right
return ans
Root, Left, Right https://leetcode.com/problems/binary-tree-preorder-traversal
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
stack = [root]
ans = []
while stack:
node = stack.pop()
if node:
ans.append(node.val)
stack.append(node.right)
stack.append(node.left)
return ans
Left, Right, Root https://leetcode.com/problems/binary-tree-postorder-traversal/ modified postorder and reverse results
class Solution:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
ans = []
stack = [root]
while stack:
# modified preorder: root, right, left
node = stack.pop()
if node:
ans.append(node.val)
stack.append(node.left)
stack.append(node.right)
return ans[::-1]
using a visited flag
class Solution:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
ans = []
stack = [(root, False)] # node, visited
while stack:
node, visited = stack.pop()
if node:
if visited:
ans.append(node.val)
else:
stack.append((node, True))
stack.append((node.right, False))
stack.append((node.left, False))
return ans