654 最大二叉树
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
- 二叉树的根是数组中的最大元素。
- 左子树是通过数组中最大值左边部分构造出的最大二叉树。
- 右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。
又是来构建二叉树,和前序中序遍历来返回二叉树类似,利用前序遍历遍历,只不过这里的分割
条件有变化而已。
递归三要素
1. 递归参数和返回值 递归参数就是节点和对应的节点列表,返回的是节点
2. 递归中止条件 如果not node return node
3. 单层递归
确定根节点
切割左右子树
递归左子树
递归右子树
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
if len(nums) == 1: return TreeNode(val=nums[0])
root_val = max(nums)
root = TreeNode(root_val)
split_index = nums.index(root_val)
# 划分左右子树
if split_index > 0:
left_tree = nums[:split_index]
root.left = self.constructMaximumBinaryTree(left_tree)
if split_index < len(nums) - 1:
right_tree = nums[(split_index+1):]
root.right = self.constructMaximumBinaryTree(right_tree)
return root
617 合并二叉树
给你两棵二叉树: root1
和 root2
。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
同样,这个提的思路也明确,采用前序遍历
对于根节点,如果都存在,相加val,其中一个为None,就返回另一个。因为提示说合并必须从root1或者root2开始,因此你不能新创一个节点
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.二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
二叉树搜索数的性质就是 左子树的值都小于根节点,右子树的值都大于根节点
因此,我们可以直接判断
递归很简单
1. 递归参数和返回值 参数是root和val,返回值节点
2. 递归中止条件:如果not 就返回None
3.单层递归
前序
如果根节点== val ,直接返回
如果根节点>val 遍历左子树
反之 遍历右子树
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root: return None
if root and root.val == val: return root
if(root.val > val): result = self.searchBST(root.left, val)
if(root.val < val): result = self.searchBST(root.right, val)
return result
98.验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
这里要清楚一个概念,二叉搜索树是每个节点都满足 左子树小于根节点,右子树大于根节点
因此需要用递归。 正是因为这个性质,我们采用中序遍历,得到的值一定是一个不含重复元素的有序数组! 我们仅需要中序遍历,得到数组,判断是否有序就可以了
class Solution:
def __init__(self):
self.vec = []
def tranversal(self, root):
if not root: return
self.tranversal(root.left)
self.vec.append(root.val)
self.tranversal(root.right)
def isValidBST(self, root):
self.vec = []
self.tranversal(root)
for i in range(1, len(self.vec)):
if self.vec[i] <= self.vec[i-1]:
return False
return True