# CSPT23 Lecture 11 ## [In-order Traversal](https://leetcode.com/problems/binary-tree-inorder-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]: if root == None: return [] res = [] self.inorderHelper(root, res) return res def inorderHelper(self, node, res): if node.left: self.inorderHelper(node.left, res) res.append(node.val) if node.right: self.inorderHelper(node.right, res) def postorderHelper(self, node, res): if node.left: self.inorderHelper(node.left, res) if node.right: self.inorderHelper(node.right, res) res.append(node.val) def preorderHelper(self, node, res): res.append(node.val) if node.left: self.inorderHelper(node.left, res) if node.right: self.inorderHelper(node.right, res) def reversePreorderHelper(self, node, res): res.append(node.val) if node.right: self.inorderHelper(node.right, res) if node.left: self.inorderHelper(node.left, res) def reversePostorderHelper(self, node, res): if node.right: self.inorderHelper(node.right, res) if node.left: self.inorderHelper(node.left, res) res.append(node.val) def reverseInorderHelper(self, node, res): if node.right: self.inorderHelper(node.right, res) res.append(node.val) if node.left: self.inorderHelper(node.left, res) ``` ## [Level Order Traversal](https://leetcode.com/problems/binary-tree-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() nextLevel = [] resultForLevel = [] 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 ``` ## [isValidBST](https://leetcode.com/problems/validate-binary-search-tree/) ``` # 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 True 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 ``` ## Sandbox ``` from collections import deque class BinaryTreeNode: def __init__(self, val): self.val = val self.left = None self.right = None a = BinaryTreeNode(1) b = BinaryTreeNode(2) c = BinaryTreeNode(3) d = BinaryTreeNode(4) e = BinaryTreeNode(6) a.left = b a.right = c b.left = d c.left = e def levelOrderTraversal(root): queue = deque() queue.append(root) while len(queue) > 0: curr = queue.popleft() print(curr.val) if curr.left: queue.append(curr.left) if curr.right: queue.append(curr.right) def reverseLevelOrderTraversal(root): queue = deque() queue.append(root) while len(queue) > 0: curr = queue.popleft() print(curr.val) if curr.right: queue.append(curr.right) if curr.left: queue.append(curr.left) levelOrderTraversal(a) ```