学习资料:https://programmercarl.com/0654.最大二叉树.html#算法公开课
用前序遍历构造二叉树
二叉搜索树的特点,其左节点的值<每个节点的值<其右节点的值,且根节点的值大于它的左子树的所有节点的值,小于它右子树的所有节点的值,其他同理。
二叉搜索树的搜索和验证时不关心遍历顺序,因为值的大小关系已确定。
学习记录:
654.最大二叉树(前序;返回值:root;从数组中选出最大值作为root.val,切分数组获得左/右子树,然后递归;构造初始二叉树root=TreeNode(0))
点击查看代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def constructMaximumBinaryTree(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
if len(nums) == 1:
return TreeNode(nums[0])
# 如果不止一个节点,设置二叉树初始值为0,一般无左右子树
node = TreeNode(0)
max_val = 0
max_idx = 0
for i in range(len(nums)):
if nums[i] > max_val:
max_val = nums[i]
max_idx = i
node.val = max_val
# 构建左子树
if max_idx > 0: # 排除没有左子树的情况
left_ls = nums[:max_idx]
node.left = self.constructMaximumBinaryTree(left_ls) # 递归
# 构建右子树
if max_idx < len(nums)-1:
right_ls = nums[max_idx+1:]
node.right = self.constructMaximumBinaryTree(right_ls)
return node
617.合并二叉树(前序递归;若任意一个二叉树为none则和为另一个二叉树;直接在root1的基础上修改,在root.left开始递归,再对root.right递归;返回值:root1)
点击查看代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def mergeTrees(self, root1, root2):
"""
:type root1: TreeNode
:type root2: TreeNode
:rtype: TreeNode
"""
# 终止条件:如果root1没有根节点就说明root1对应的二叉树为None,那相加就是root2对应的二叉树咯
if not root1:
return root2
if not root2:
return root1
# 根:本题选择就在root1基础上进行修改,选择前序:根左右
root1.val += root2.val
# 递归法:我认为就是左子节点的处理方式与根节点一样,还是用mergeTrees,对应参数变成了root1.left和root2.left
root1.left = self.mergeTrees(root1.left, root2.left)
# 右子树同理
root1.right = self.mergeTrees(root1.right, root2.right)
# 返回值:修改后的root1
return root1
700.二叉搜索树中的搜索(思路:1当root为None或者root.val==target时都返回root;2因为二叉搜索树具备左<根<右的规律,通过root_val和target大小就看判断下一步遍历左子树还是右子树,递归)
点击查看代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def searchBST(self, root, val):
"""
:type root: TreeNode
:type val: int
:rtype: TreeNode
"""
# 如果root不存在或者根节点的值正好为目标值,则都是返回根节点,终止
if root == None or root.val == val:
return root
# 二叉搜索树的特性:左<根<右
# so, 当目标值小于根,就向左边遍历,这是一定的。
if val < root.val:
result = self.searchBST(root.left, val)
# 右边同理
if val > root.val:
result = self.searchBST(root.right, val)
return result
98.验证二叉搜索树(中序遍历+递归+双指针;pre-->root;左:递归;根:从第一个节点开始,往后遍历如果pre_val<root_val一直保持则返回True;右:递归;根据左右递归返回值共同决定返回True or False)
点击查看代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def __init__(self):
self.pre = None # 设置最小值初值
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
# 双指针法,pre-->root这种顺序,每次向后移动,如果一直保持pre.val<root.val则满足二叉搜索树的特性
# 要用中序遍历来判断二叉搜索树,则示例2中递归的顺序是:1-->5-->3-->4-->5,一看就发现第二个大于第三个,返回False
if not root:
return True
# 递归+中序
# 左
left = self.isValidBST(root.left)
# 根
if self.pre != None and self.pre.val >= root.val:
return False
self.pre = root # 向后移动指针
# 右
right = self.isValidBST(root.right)
return left and right
PS:今天的题解都比较短,舒服,就是赶紧一下就要忘记
今天吃的比较规律早中晚按时吃,晚饭突然下雨一整个雨中狂奔
好多测评要做,题也不是很难就是时间短永远做不完,狂投简历中,
实在不行咱也能gap一年,没太大事儿