目录
654.最大二叉树
又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视频,好好体会一下 为什么构造二叉树都是 前序遍历题目链接/文章讲解:代码随想录
思路
这道题和我们学院自己的OJ上的第一题基本一模一样,就是一直递归,只要坚持左闭右开的原则,问题不大。
代码
from typing import List, Optional
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 not nums:
return None
max_val = max(nums)
max_idx = nums.index(max_val)
root = TreeNode(max_val)
nums_left = nums[:max_idx]
nums_right = nums[max_idx+1:]
root.left = self.constructMaximumBinaryTree(nums_left)
root.right = self.constructMaximumBinaryTree(nums_right)
return root
617.合并二叉树
这次是一起操作两个二叉树了, 估计大家也没一起操作过两个二叉树,也不知道该如何一起操作,可以看视频先理解一下。 优先掌握递归。题目链接/文章讲解:代码随想录
思路
不要被一次操作两棵树吓懵了,(虽然我开始也很懵逼),你可以考虑自己新建一棵树或者在原有的树上进行操作。每次无非判断两棵树对应位置的地方是不是None,不是就把两个节点的值相加合并。
代码
from typing import Optional
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
if root1 is None and root2 is None:
return None
if root1 is not None and root2 is None:
return root1
if root1 is None and root2 is not None:
return root2
if root1 is not None and root2 is not None:
root_val = root1.val + root2.val
root = TreeNode(root_val)
root.left = self.mergeTrees(root1.left, root2.left)
root.right = self.mergeTrees(root1.right,root2.right)
return root
700.二叉搜索树中的搜索
递归和迭代 都可以掌握以下,因为本题比较简单, 了解一下 二叉搜索树的特性题目链接/文章讲解: 代码随想录
思路
咳咳,首先,我写题时没注意看这是二叉搜索树了,(其实是我忘了什么是二叉搜索树了。。。)如果按普通树来写会浪费很多时间。其实递归起来不是很难。
代码
from typing import Optional
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
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)
98.验证二叉搜索树
遇到 搜索树,一定想着中序遍历,这样才能利用上特性。但本题是有陷阱的,可以自己先做一做,然后在看题解,看看自己是不是掉陷阱里了。这样理解的更深刻。
题目链接/文章讲解:代码随想录
思路
Carl哥真是厉害,完美的预判了我会踩坑里(每日崩溃1/1),我写完发现我就掉进了第一个陷阱了。。。
陷阱1
不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了。我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。
陷阱2(和python无关吧)
样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。
此时可以初始化比较元素为longlong的最小值。
再告诉你一个冷知识:
要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。
有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。
我嘞个豆啊!还能这样。。。早知道这个冷知识说不定就写出来了。
代码
from typing import Optional
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def __init__(self):
self.res = []
def traversal(self, root):
if root is None:
return
self.traversal(root.left)
self.res.append(root.val)
self.traversal(root.right)
def isValidBST(self, root):
self.res = []
self.traversal(root)
for i in range(1, len(self.res)):
if self.res[i] <= self.res[i - 1]:
return False
return True