# CSPT27 Lecture 11 ## Depth-first Traversals ``` # 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 inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: if root == None: return [] res = [] self.inorderTraversalHelper(root, res) return res def inorderTraversalHelper(self, currentNode, res): if currentNode.left: self.inorderTraversalHelper(currentNode.left, res) res.append(currentNode.val) if currentNode.right: self.inorderTraversalHelper(currentNode.right, res) # 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]: if root == None: return [] res = [] self.preorderTraversalHelper(root, res) return res def preorderTraversalHelper(self, currentNode, res): res.append(currentNode.val) if currentNode.left: self.preorderTraversalHelper(currentNode.left, res) if currentNode.right: self.preorderTraversalHelper(currentNode.right, res) # 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 postorderTraversal(self, root: Optional[TreeNode]) -> List[int]: if root == None: return [] res = [] self.postorderTraversalHelper(root, res) return res def postorderTraversalHelper(self, currentNode, res): if currentNode.left: self.postorderTraversalHelper(currentNode.left, res) if currentNode.right: self.postorderTraversalHelper(currentNode.right, res) res.append(currentNode.val) ``` ## Level Order Traversal ``` from collections import deque # 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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: if root == None: return [] res = [] 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: nextLevel.append(node.left) if node.right: nextLevel.append(node.right) if len(nextLevel) > 0: queue.append(nextLevel) res.append(resultForLevel) return res ``` ## Validate BST ``` from collections import deque # 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 isValidBST(self, root: Optional[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: stack.append((currNode.left, currMin, currNode.val)) if currNode.right: stack.append((currNode.right, currNode.val, currMax)) return True ```