654.最大二叉树
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
if not nums:
return None
root_val = max(nums)
root = TreeNode(root_val)
max_idx = nums.index(root_val)
leftnums = nums[:max_idx]
rightnums = nums[max_idx + 1:]
root.left = self.constructMaximumBinaryTree(leftnums)
root.right = self.constructMaximumBinaryTree(rightnums)
return root
先找到数组中最大的数 作为根节点 在分割数组的左右子数组 进行递归
617.合并二叉树
class Solution:
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
if not root1:
return root2
if not root2:
return root1
#为了节约空间 也可直接把合并结果加到root1上
root = TreeNode(root1.val + root2.val)
root.left = self.mergeTrees(root1.left, root2.left)
root.right = self.mergeTrees(root1.right, root2.right)
return root
700.二叉搜索树中的搜索
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root:
return None
if root.val == val:
return root
elif root.val < val:
return self.searchBST(root.right, val)
else:
return self.searchBST(root.left, val)
98.验证二叉搜索树
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
nums = []
def Traversal(root: Optional[TreeNode], nums: List[int]):
if not root:
return
Traversal(root.left, nums)
nums.append(root.val)
Traversal(root.right, nums)
def isSorted(nums: List[int]) -> bool:
for i in range(1, len(nums)):
if nums[i - 1] >= nums[i]:
return False
return True
Traversal(root, nums)
return isSorted(nums)
!先把二叉搜索树转换成数组 在判断数组是否有序
注:我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。所以以下代码的判断逻辑是错误的。
if root.left and root.left.val < root.val and root.right and root.right.val > root.val:
return True
else:
return False