代码随想录算法训练营第20天 |
654.最大二叉树
https://leetcode.cn/problems/maximum-binary-tree/
654.最大二叉树代码随想录
https://programmercarl.com/0654.最大二叉树.html
617.合并二叉树
https://leetcode.cn/problems/merge-two-binary-trees/description/
617.合并二叉树代码随想录
https://programmercarl.com/0617.合并二叉树.html
98.验证二叉树
https://leetcode.cn/problems/validate-binary-search-tree/description/
98.验证二叉树代码随想录
https://programmercarl.com/0098.验证二叉搜索树.html#算法公开课
700.二叉搜索树中的搜索
https://leetcode.cn/problems/search-in-a-binary-search-tree/description/
700.二叉搜索树中的搜索
https://programmercarl.com/0098.验证二叉搜索树.html#算法公开课
654.最大二叉树
题目
给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
题解重点:
- 递归法:trans函数 返回参数即可
题解代码:
递归法
class Solution:
def trans(self,nums,left,right):
if left>=right:
return None
max_index = left
for i in range(left+1,right):
if nums[i]>nums[max_index]:
max_index = i
root = TreeNode(nums[max_index])
root.left = self.trans(nums,left,max_index)
root.right = self.trans(nums,max_index+1,right)
return root
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
return self.trans(nums,0,len(nums))
617.合并二叉树
题目
给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
题解重点
- 递归法:前中后序都可以 只要遍历两棵树即可
- 迭代法:队列模拟层序遍历;两个都存在就存进去;不一样的子树,从右边直接挪到左边来;
题解代码
递归法
class Solution:
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
if not root1 and not root2:
return None
if not root1:
return root2
if not root2:
return root1
if root1 and root2:
root = TreeNode(root1.val+root2.val)
root.left = self.mergeTrees(root1.left,root2.left)
root.right = self.mergeTrees(root1.right,root2.right)
return root
迭代法
class Solution:
def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
if not root1:
return root2
if not root2:
return root1
que = collections.deque()
que.append(root1)
que.append(root2)
while que:
node1 = que.popleft()
node2 = que.popleft()
if node1.left and node2.left:
que.append(node1.left)
que.append(node2.left)
if node1.right and node2.right:
que.append(node1.right)
que.append(node2.right)
node1.val += node2.val
if not node1.left and node2.left:
node1.left = node2.left
if not node1.right and node2.right:
node1.right = node2.right
return root1
700.二叉搜索树
题目
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
题解:
- 按照树的性质运行即可
题解代码:
递归法
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root or root.val==val:
return root
if val<root.val:
return self.searchBST(root.left,val)
if val>root.val:
return self.searchBST(root.right,val)
迭代法
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
while root:
if val<root.val:
root = root.left
elif val>root.val:
root = root.right
else:
return root
return root
98.验证二叉搜索树
题目
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树
题解
- 注意有坑!整个左子树上的数字都不能大于右子树。也就是说:左子树的右子树也应该小于根节点;
- 递归法:建立统一变量;
- 迭代法:栈+ curr pre节点对比
题解代码:
class Solution:
def __init__(self):
self.vec = []
def trans(self,root):
if not root:
return True
self.trans(root.left)
self.vec.append(root.val)
self.trans(root.right)
def isValidBST(self, root: Optional[TreeNode]) -> bool:
self.vec = []
self.trans(root)
for i in range(1,len(self.vec)):
if self.vec[i]<=self.vec[i-1]:
return False
return True
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
st = []
pre = None
curr = root
while curr or len(st)>0:
if curr:
st.append(curr)
curr = curr.left
else:
curr = st.pop()
if pre and curr.val<=pre.val:
return False
pre = curr
curr = curr.right
return True
标签:right,nums,self,随想录,搜索,二叉树,root,left
From: https://www.cnblogs.com/P201821440041/p/18263226