654. 最大二叉树
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
if len(nums) == 0:
return
root = TreeNode(val = max(nums))
left_nums = nums[:nums.index(max(nums))]
right_nums = nums[nums.index(max(nums)) + 1:]
root.left = self.constructMaximumBinaryTree(left_nums)
root.right = self.constructMaximumBinaryTree(right_nums)
return root
递归分而治之的思想,和上一题很类似,构建二叉树
1. 找到最大值 建立根节点
2. 分别切出左子树和右子树
3. 构建左节点等于新构建的左子树
4. 构建右节点等于新构建的右子树
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.val += root2.val
root1.left = self.mergeTrees(root1.left, root2.left)
root1.right = self.mergeTrees(root1.right, root2.right)
return root1
两棵树同时遍历,如果遇到一棵树节点为空 则返回另一棵树的节点,如果都不为空则节点的值累加。
然后分别遍历左右子树
700. 二叉搜索树中的搜索
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root:
return None
if root.val == val:
return root
left_cur = self.searchBST(root.left, val)
right_cur = self.searchBST(root.right, val)
if not left_cur and not right_cur:
return None
if left_cur:
return left_cur
if right_cur:
return right_cur
没有看到题目搜索树的定义,直接按普通的树遍历了
思路是如果遍历到空节点就return None 找到了就return当前节点,分别记录左树和右树的返回值,最后如果有root节点记录下来 就返回
98. 验证二叉搜索树
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
def traversal(result, root):
if not root:
return
traversal(result, root.left)
result.append(root.val)
traversal(result, root.right)
result = []
traversal(result, root)
print(result)
for i,val in enumerate(result):
if(i >= 1 and result[i] <= result[i - 1]):
return False
return True
二叉搜索树 中序遍历完一定是递增的数组,所以先中序遍历一下 然后判断数组是不是递增