654 最大的二叉树
题目
给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
solution
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
if nums==[]:
return None
root=max(nums)
cut=nums.index(root)
root=TreeNode(root)
root.left=self.constructMaximumBinaryTree(nums[:cut])
root.right=self.constructMaximumBinaryTree(nums[cut+1:])
return root
难点
怎么确定class solution()的structure,以及确定函数的参数怎么设计,是我的难点。
617 合并二叉树
我的难点
- 不知道怎么写终止条件
- 怎么同步地遍历两个二叉树
solution
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def traversal(self,node1,node2):
# 不建立新的树,直接修改tree1的结点
# node1用来遍历tree1 node2用来遍历tree2
if node1==None: return node2
if node2==None: return node1
# node1和node2都不为空
node1.val+=node2.val
node1.left=self.traversal(node1.left,node2.left)
node1.right=self.traversal(node1.right,node2.right)
return node1
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
return self.traversal(root1,root2)
700 二叉搜索树
solution
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
# 一开始超过时间限制了 因为忘记了二叉搜索树的特征
class Solution:
def search_traversal(self,node,val):
if node==None: return None
if node.val==val: return node
elif val<node.val:
return self.search_traversal(node.left,val)
else:
return self.search_traversal(node.right,val)
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
res=self.search_traversal(root,val)
return res
一开始超过时间限制了 因为忘记了二叉搜索树的特征
98 验证二叉搜索树(有技巧!)
题目
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
我的错误
- 我采用了前序遍历:不知道怎么判断一棵树是否是二叉搜索树,进入了陷阱中,只判断子树的左节点是否小于中间节点,右节点是否大于中间节点来判断了
solution
应该采用中序遍历,将遍历的顺序用一个数组记录下来。对于二叉搜索树的record数组是一个严格单调递增数组
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def traversal(self,node,record):
if node==None:return
self.traversal(node.left,record)
record.append(node.val)
self.traversal(node.right,record)
def isValidBST(self, root: Optional[TreeNode]) -> bool:
record=[]
self.traversal(root,record)
print(record)
for i in range(1,len(record)):
if record[i]<=record[i-1]:
return False
return True