# CSPT25 Lecture 11 ## In/Post/Pre-order Traversal ``` # 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]: res = [] if root == None: return res self.inorderTraversalHelper(root, res) return res def inorderTraversalHelper(self, currNode, res): if currNode.left: self.inorderTraversalHelper(currNode.left, res) res.append(currNode.val) if currNode.right: self.inorderTraversalHelper(currNode.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]: res = [] if root == None: return res self.preorderTraversalHelper(root, res) return res def preorderTraversalHelper(self, currNode, res): res.append(currNode.val) if currNode.left: self.preorderTraversalHelper(currNode.left, res) if currNode.right: self.preorderTraversalHelper(currNode.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]: res = [] if root == None: return res self.postorderTraversalHelper(root, res) return res def postorderTraversalHelper(self, currNode, res): if currNode.left: self.postorderTraversalHelper(currNode.left, res) if currNode.right: self.postorderTraversalHelper(currNode.right, res) res.append(currNode.val) ``` ## Level-Order Traversal ``` # 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: 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 = [] nodesInNextLevel = [] for node in nodesInLevel: resultForLevel.append(node.val) if node.left: nodesInNextLevel.append(node.left) if node.right: nodesInNextLevel.append(node.right) if len(nodesInNextLevel) > 0: queue.append(nodesInNextLevel) res.append(resultForLevel) return res ``` ## Validate BST ``` # 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: def isValidBST(self, root: Optional[TreeNode]) -> bool: if root == None: return [] queue = deque() queue.append((root, float("-inf"), float("inf"))) while len(queue) > 0: curr = queue.popleft() currNode, currMin, currMax = curr[0], curr[1], curr[2] if currNode.val <= currMin or currNode.val >= currMax: return False if currNode.left: queue.append((currNode.left, currMin, currNode.val)) if currNode.right: queue.append((currNode.right, currNode.val, currMax)) return True ``` ## Playground ``` from collections import deque class BinaryTreeNode: def __init__(self, value): self.value = value self.left = None self.right = None a = BinaryTreeNode(1) b = BinaryTreeNode(2) c = BinaryTreeNode(3) d = BinaryTreeNode(4) e = BinaryTreeNode(5) f = BinaryTreeNode(6) g = BinaryTreeNode(7) h = BinaryTreeNode(8) a.left = b a.right = c b.left = d b.right = e c.left = f c.right = g f.left = h def levelOrderTraversal(root): res = [] queue = deque() queue.append(root) while len(queue) > 0: curr = queue.popleft() res.append(curr.value) if curr.left: queue.append(curr.left) if curr.right: queue.append(curr.right) return res ```