# CSPT27 Lecture 12 ## Max Depth ``` # 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 from collections import deque class Solution: """ Plan The type of traversal doesn't matter. As long as we find all the leaf nodes and output the maximum depth found. Runtime: O(n) Space: O(n) """ def maxDepth(self, root: Optional[TreeNode]) -> int: if root == None: return 0 queue = deque() queue.append((root, 1)) maxDepthFoundSoFar = 0 while len(queue) > 0: curr = queue.popleft() currNode, currDepth = curr[0], curr[1] if currNode.left == None and currNode.right == None: if currDepth > maxDepthFoundSoFar: maxDepthFoundSoFar = currDepth if currNode.left: queue.append((currNode.left, currDepth + 1)) if currNode.right: queue.append((currNode.right, currDepth + 1)) return maxDepthFoundSoFar def maxDepthRecursive(self, root: Optional[TreeNode]) -> int: if root == None: return 0 self.maxDepthFoundSoFar = 0 self.maxDepthHelper(root, 1) return self.maxDepthFoundSoFar def maxDepthHelper(self, root, currDepth): if root.left == None and root.right == None: if currDepth > self.maxDepthFoundSoFar: self.maxDepthFoundSoFar = currDepth return if root.left: self.maxDepthHelper(root.left, currDepth + 1) if root.right: self.maxDepthHelper(root.right, currDepth + 1) def iterativeDFSMaxDepth(self, root: Optional[TreeNode]) -> int: if root == None: return 0 stack = deque() stack.append((root, 1)) maxDepthFoundSoFar = 0 while len(stack) > 0: curr = stack.pop() currNode, currDepth = curr[0], curr[1] if currNode.left == None and currNode.right == None: if currDepth > maxDepthFoundSoFar: maxDepthFoundSoFar = currDepth if currNode.left: stack.append((currNode.left, currDepth + 1)) if currNode.right: stack.append((currNode.right, currDepth + 1)) return maxDepthFoundSoFar ``` ## Kth Smallest Element ``` # 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: """ Runtime: O(n) Space: O(n) """ def kthSmallest(self, root: Optional[TreeNode], k: int) -> int: self.numProcessed = 0 return self.kthSmallestHelper(root, k) def kthSmallestHelper(self, currNode, k): if currNode.left: leftSubtree = self.kthSmallestHelper(currNode.left, k) if leftSubtree != None: return leftSubtree self.numProcessed += 1 if self.numProcessed == k: return currNode.val if currNode.right: rightSubtree = self.kthSmallestHelper(currNode.right, k) if rightSubtree != None: return rightSubtree return None ```