1、最大二叉树
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
if not nums: return None # 终止条件
root_val = max(nums) # 求出当前数组最大值
val_id = nums.index(root_val) # 找出最大值下表,供后序切割数组
root = TreeNode(root_val) # 构建节点
nums_left, nums_right = nums[:val_id], nums[val_id + 1:] # 切割数组
root.left = self.constructMaximumBinaryTree(nums_left) # 向左遍历
root.right = self.constructMaximumBinaryTree(nums_right) # 向右遍历
return root #返回根节点
思路如注释
2、合并二叉树
class Solution:
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
if not root1 and not root2: return None # 如果两棵树都为空
if not root1 and root2: return root2 #其中一颗树不为空
if root1 and not root2: return root1
root1.val = root1.val + root2.val # 都不为空就相加
root1.left = self.mergeTrees(root1.left, root2.left) # 向左遍历
root1.right = self.mergeTrees(root1.right, root2.right) # 向右遍历
return root1 # 返回根节点
3、二叉搜索树中的搜索
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root: return None
if root.val == val: # 找到了节点,返回
return root
if val < root.val: # 小于就向左遍历,反之亦然
return self.searchBST(root.left, val)
else:
return self.searchBST(root.right, val)
4、验证二叉搜索树
class Solution:
def valid(self, root, min_val, max_val):
if not root: return True # 搜到底了,返回True
if root.val <= min_val or root.val >= max_val:
return False
#限定:左子树的值只能在最小值到父节点之间;右节点的值只能在父节点到最大值之间,最小最大随
#迭代不断更新,其实就是不断缩小范围
return self.valid(root.left, min_val, root.val) and self.valid(root.right, root.val, max_val)
def isValidBST(self, root: Optional[TreeNode]) -> bool:
return self.valid(root,float('-inf'),float('inf'))