代码随想录算法训练营|654.最大二叉树;617.合并二叉树;700.二叉搜索树中的搜索;98.验证二叉搜索树
654.最大二叉树
题目链接: 654.最大二叉树
文档讲解: 代码随想录
题目难度:简单
思路: 递归法
时间复杂度:O(n);空间复杂度:O(1)
下面展示 代码
:
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
if len(nums) == 0:
return None
max1 = max(nums)
max_index = nums.index(max1)
node = TreeNode(max1)
node.left = self.constructMaximumBinaryTree(nums[:max_index])
node.right = self.constructMaximumBinaryTree(nums[max_index + 1:])
return node
617.合并二叉树
题目链接: [617.合并二叉树](https://leetcode.cn/problems/merge-two-binary-trees/)
文档讲解: 代码随想录
题目难度:简单
思路: 前序遍历+递归
时间复杂度:O(n);空间复杂度:O(1)
代码
如下
class Solution:
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
if root1 == None:
return root2
if root2 == None:
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.二叉搜索树中的搜索
题目链接: 700.二叉搜索树中的搜索
文档讲解: 代码随想录
题目难度:简单
思路: 和二分法类似
时间复杂度:O(log(n));空间复杂度:O(1)
代码
如下
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if root == None:
return None
if root.val == val:
return root
else:
if root.val > val:
return self.searchBST(root.left, val)
if root.val < val:
return self.searchBST(root.right, val)
return None
98.验证二叉搜索树
题目链接: 98.验证二叉搜索树
文档讲解: 代码随想录
题目难度:简单
思路: 验证二叉搜索树,就相当于变成了判断一个序列是不是递增的
注:不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了,我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。
时间复杂度:O(n);空间复杂度:O(1)
代码
如下
class Solution:
def __init__(self) -> None:
self.min1 = float('-Inf')
def isValidBST(self, root: Optional[TreeNode]) -> bool:
if root == None:
return True
# 中序遍历
# 注意:二叉搜索树:左子树所有节点小于中间节点,右子树所有节点大于中间节点
left = self.isValidBST(root.left)
if root.val > self.min1:
self.min1 = root.val
else:
return False
right = self.isValidBST(root.right)
if left and right:
return True
else:
return False