第六章 二叉树 part05
654.最大二叉树
- 构造二叉树都是前序遍历
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
if len(nums)==1:
return TreeNode(nums[0])
# 先构建根节点,寻找最大值
maxvalue=0
maxindex=0
for index,x in enumerate(nums):
if x>maxvalue:
maxvalue=x
maxindex=index
root=TreeNode(val=maxvalue)
#构建左子树
if maxindex>0:#保证左子树有树
root.left=self.constructMaximumBinaryTree(nums[:maxindex])
#构建右子树
if maxindex<len(nums)-1:
root.right=self.constructMaximumBinaryTree(nums[maxindex+1:])
return root
617.合并二叉树
class Solution:
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
# 前序遍历:中左右
if not root1:
return root2
if not root2:
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.二叉搜索树中的搜索
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)
为什么要有返回值: 因为搜索到目标节点就要立即return, 这样才是找到节点就返回(搜索某一条边),如果不加return,就是遍历整棵树了
98.验证二叉搜索树
- 遇到搜索树,一定想着中序遍历,这样才能利用上特性。
class Solution:
def __init__(self):
self.num=[]
def isValidBST(self, root: Optional[TreeNode]) -> bool:
#左中右
if not root:
return None
self.isValidBST(root.left)
self.num.append(root.val)
self.isValidBST(root.right)
#判断数组是否从小到大排序
pre=self.num[0]
for x in self.num[1:]:
if pre>=x:
return False
pre=x
return True