当前位置:   article > 正文

代码随想录算法训练营day20 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

代码随想录算法训练营day20 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

654.最大二叉树

比之前利用中序和后序构建二叉树简单一些

  1. class Solution:
  2. def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
  3. if not nums:
  4. return None
  5. max_val = max(nums)
  6. max_index = nums.index(max_val)
  7. root = TreeNode(max_val)
  8. root.left = self.constructMaximumBinaryTree(nums[:max_index])
  9. root.right = self.constructMaximumBinaryTree(nums[max_index+1:])
  10. return root

617.合并二叉树

递归法,直接利用root1

  1. class Solution:
  2. def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
  3. if not root1:
  4. return root2
  5. if not root2:
  6. return root1
  7. root1.val += root2.val
  8. root1.left = self.mergeTrees(root1.left, root2.left)
  9. root1.right = self.mergeTrees(root1.right, root2.right)
  10. return root1

700.二叉搜索树中的搜索

递归法

  1. class Solution:
  2. def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
  3. if not root or root.val == val:
  4. return root
  5. if root.val > val:
  6. return self.searchBST(root.left, val)
  7. else:
  8. return self.searchBST(root.right, val)

迭代法

  1. class Solution:
  2. def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
  3. while root:
  4. if root.val == val:
  5. return root
  6. elif root.val > val:
  7. root = root.left
  8. else:
  9. root = root.right
  10. return

98.验证二叉搜索树

递归法

递归三部曲

  1. 参数为当前节点,最大最小值范围,返回值为是否满足
  2. 终止条件:节点为空,返回True;节点超出范围,返回False
  3. 单层逻辑:当前节点是否满足范围,如果满足,则遍历左节点,更新左节点的最大最小值范围,遍历右节点,更新右节点的最大最小值范围
  1. class Solution:
  2. def isValidBST(self, root: Optional[TreeNode]) -> bool:
  3. return self.traversal(root, float('-inf'), float('inf'))
  4. def traversal(self, node, min_val, max_val):
  5. if not node:
  6. return True
  7. if node.val <= min_val or node.val >= max_val:
  8. return False
  9. return self.traversal(node.left, min_val, min(max_val, node.val)) and self.traversal(node.right, max(min_val, node.val), max_val)

看了题解之后,和我写的好不一样,需要花时间研究一下,看了视频

直接的做法:中序遍历得到数组,看看数组是不是递增

优化的做法:在中序遍历的时候,直接比较遍历值是不是递增的。

在这种做法的时候,可以先声明一个最小值,但是有可能树中存在这个最小值导致结果报错,优化的做法是将遍历的第一个元素赋值给声明的元素,然后逐渐比较

  1. class Solution:
  2. def __init__(self):
  3. self.min_val = float('-inf')
  4. def isValidBST(self, root: Optional[TreeNode]) -> bool:
  5. # 中序遍历,查看是否递增
  6. if not root:
  7. return True
  8. if not self.isValidBST(root.left):
  9. return False
  10. if root.val <= self.min_val:
  11. return False
  12. else:
  13. self.min_val = root.val
  14. if not self.isValidBST(root.right):
  15. return False
  16. return True

写的不够简洁,重新优化一次

  1. class Solution:
  2. def __init__(self):
  3. self.max_val = float('-inf')
  4. def isValidBST(self, root: Optional[TreeNode]) -> bool:
  5. # 中序遍历,查看是否递增
  6. if not root:
  7. return True
  8. left = self.isValidBST(root.left)
  9. if root.val <= self.max_val:
  10. return False
  11. else:
  12. self.max_val = root.val
  13. right = self.isValidBST(root.right)
  14. return left and right

不使用最小值的办法优化一次

  1. class Solution:
  2. def __init__(self):
  3. self.pre = None
  4. def isValidBST(self, root: Optional[TreeNode]) -> bool:
  5. # 中序遍历,查看是否递增
  6. if not root:
  7. return True
  8. left = self.isValidBST(root.left)
  9. if self.pre and root.val <= self.pre.val:
  10. return False
  11. else:
  12. self.pre = root
  13. right = self.isValidBST(root.right)
  14. return left and right

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/程序质量控制师/article/detail/61207
推荐阅读
相关标签
  

闽ICP备14008679号