1. Trim a Binary Search Tree (Leetcode Number: 669)
Take care while trimming the nodes that sit out of the given range off the tree
class Solution:
def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
if not root:
return None
# Discard the right nodes as the values are bigger than given high
if root.val > high:
return self.trimBST(root.left, low, high)
# Discard the left nodes as the values are smaller than given low
if root.val < low:
return self.trimBST(root.right, low, high)
if root.val >= low and root.val <= high:
root.left = self.trimBST(root.left, low, high)
root.right = self.trimBST(root.right, low, high)
return root
2. Convert Sorted Array to Binary Search Tree (Leetcode Number: 108)
Take extra care while defining the mid variable as it's constructed by boundaries values left and right.
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
root = self.traversal(nums, 0, len(nums) -1 )
return root
# Made the mistake of writing the following function within sortedArrayToBST
def traversal(self, nums: List[int], left: int, right: int) -> TreeNode:
if left > right:
return None
# Assign the middle value to the root
mid = left + (right - left) // 2
root = TreeNode(nums[mid])
# mid is excluded
root.left = self.traversal(nums, left, mid - 1)
root.right = self.traversal(nums, mid + 1, right)
return root
3. Convert BST to Greater Tree (Leetcode Number: 538)
Reversed Inorder DFS, right -> node -> left.
class Solution:
def __init__(self):
self.total = 0
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return None
self.convertBST(root.right)
self.total += root.val
root.val = self.total
self.convertBST(root.left)
return root