# CSPT17 Lecture 9
## Depth-first Traversals
```
"""
https://leetcode.com/problems/binary-tree-inorder-traversal/
https://leetcode.com/problems/binary-tree-preorder-traversal/
https://leetcode.com/problems/binary-tree-postorder-traversal/
https://leetcode.com/problems/binary-tree-level-order-traversal/
"""
# Post-order
def postorderTraversal(self, root: TreeNode) -> List[int]:
res = []
if root != None:
self.postorderTraversalHelper(root, res)
return res
def postorderTraversalHelper(self, root, res):
if root == None:
return
# go to left subtree first
if root.left != None:
self.postorderTraversalHelper(root.left, res)
# go to right subtree next
if root.right != None:
self.postorderTraversalHelper(root.right, res)
# process current node
res.append(root.val)
# Pre-order
def preorderTraversal(self, root: TreeNode) -> List[int]:
res = []
if root != None:
self.preorderTraversalHelper(root, res)
return res
def preorderTraversalHelper(self, root, res):
if root == None:
return
# process current node
res.append(root.val)
# go to left subtree first
if root.left != None:
self.preorderTraversalHelper(root.left, res)
# go to right subtree next
if root.right != None:
self.preorderTraversalHelper(root.right, res)
# In-order
def inorderTraversal(self, root: TreeNode) -> List[int]:
res = []
if root != None:
self.inorderTraversalHelper(root, res)
return res
def inorderTraversalHelper(self, root, res):
if root == None:
return
# go to left subtree first
if root.left != None:
self.inorderTraversalHelper(root.left, res)
# process current node
res.append(root.val)
# go to right subtree next
if root.right != None:
self.inorderTraversalHelper(root.right, res)
```
## [Level Order Traversal](https://leetcode.com/problems/binary-tree-level-order-traversal/)
```
def levelOrder(self, root: TreeNode) -> List[List[int]]:
self.res = []
if root != None:
self.levelOrderHelper(root)
return self.res
def levelOrderHelper(self, root):
queue = deque()
queue.append([root])
while len(queue) > 0:
nodesInLevel = queue.popleft()
resultForLevel = []
nextLevel = []
for node in nodesInLevel:
resultForLevel.append(node.val)
if node.left != None:
nextLevel.append(node.left)
if node.right != None:
nextLevel.append(node.right)
if len(nextLevel) > 0:
queue.append(nextLevel)
self.res.append(resultForLevel)
```
## [Valid BST](https://leetcode.com/problems/validate-binary-search-tree/)
```
def isValidBST(self, root: TreeNode) -> bool:
if root == None:
return True
stack = deque()
stack.append((root, float("-inf"), float("inf")))
while len(stack) > 0:
curr = stack.pop()
currNode, currMin, currMax = curr[0], curr[1], curr[2]
if currNode.val <= currMin or currNode.val >= currMax:
return False
if currNode.left != None:
stack.append((currNode.left, min(currNode.left.val, currMin), currNode.val))
if currNode.right != None:
stack.append((currNode.right, currNode.val, max(currNode.right.val, currMax)))
return True
```