654.最大二叉树 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思考
为什么构造二叉树都是 前序遍历
为什么不对数组为空这一情况进行考虑
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
if len(nums) == 1:
return TreeNode(nums[0])
node = TreeNode(0)
# 找到数组中最大的值和对应的下标
maxValue = 0
maxValueIndex = 0
for i in range(len(nums)):
if nums[i] > maxValue:
maxValue = nums[i]
maxValueIndex = i
node.val = maxValue
# 最大值所在的下标左区间 构造左子树
if maxValueIndex > 0:
new_list = nums[:maxValueIndex]
node.left = self.constructMaximumBinaryTree(new_list)
# 最大值所在的下标右区间 构造右子树
if maxValueIndex < len(nums) - 1:
new_list = nums[maxValueIndex+1:]
node.right = self.constructMaximumBinaryTree(new_list)
return node
617.合并二叉树 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
提醒
这次是一起操作两个二叉树了
class Solution:
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
# 递归终止条件:
# 但凡有一个节点为空, 就立刻返回另外一个. 如果另外一个也为None就直接返回None.
if not root1:
return root2
if not root2:
return root1
# 上面的递归终止条件保证了代码执行到这里root1, root2都非空.
root1.val += root2.val # 中
root1.left = self.mergeTrees(root1.left, root2.left) #左
root1.right = self.mergeTrees(root1.right, root2.right) # 右
return root1
# ⚠️ 注意: 本题我们重复使用了题目给出的节点而不是创建新节点. 节省时间, 空间.
700.二叉搜索树中的搜索力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
提醒
①递归和迭代 都可以掌握以下,因为本题比较简单, 了解一下 二叉搜索树的特性
②二叉搜索树是一个有序树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树
③二叉搜索树的节点是有序的,所以可以有方向的去搜索,这与普通的二叉树的单层逻辑不同。如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL。
递归法
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
# 为什么要有返回值:
# 因为搜索到目标节点就要立即return,
# 这样才是找到节点就返回(搜索某一条边),如果不加return,就是遍历整棵树了。
if not root or root.val == val:
return root
if root.val > val:
return self.searchBST(root.left, val)
if root.val < val:
return self.searchBST(root.right, val)
迭代法
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
while root:
if val < root.val:
root = root.left
elif val > root.val:
root = root.right
else:
return root
return None
98.验证二叉搜索树力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
提醒
遇到 搜索树,一定想着中序遍历,这样才能利用上特性,但本题是有陷阱的
递归法(版本一)利用中序递增性质,转换成数组
class Solution:
def __init__(self):
self.vec = []
def traversal(self, root):
if root is None:
return True
self.traversal(root.left)
self.vec.append(root.val) # 将二叉搜索树转换为有序数组
self.traversal(root.right)
def isValidBST(self, root):
self.vec = [] # 清空数组
self.traversal(root)
for i in range(1, len(self.vec)):
# 注意要小于等于,搜索树里不能有相同元素
if self.vec[i] <= self.vec[i - 1]:
return False
return True
递归法(版本二)双指针优化
class Solution:
def __init__(self):
self.pre = None # 用来记录前一个节点
def isValidBST(self, root):
if root is None:
return True
#左
left = self.isValidBST(root.left)#等于其返回值
#中
if self.pre is not None and self.pre.val >= root.val:
return False
self.pre = root # 记录前一个节点
#右
right = self.isValidBST(root.right)
return left and right
迭代法
二刷再写