[英雄星球六月集训LeetCode解题日报] 第20日 e二叉搜索树
日报
- 水了4题。
题目
一、 700. 二叉搜索树中的搜索
链接: 700. 二叉搜索树中的搜索
1. 题目描述
2. 思路分析
按BST定义搜索。
3. 代码实现
class Solution:
def searchBST(self, root: TreeNode, val: int) -> TreeNode:
if not root:
return None
if val == root.val:
return root
if val < root.val:
return self.searchBST(root.left,val)
return self.searchBST(root.right,val)
二、 剑指 Offer 54. 二叉搜索树的第k大节点
1. 题目描述
2. 思路分析
稍麻烦一些,第k大,按右中左顺序dfs,全局变量计数。
3. 代码实现
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
cnt = 0
def dfs(root):
if not root:
return None
r = dfs(root.right)
if r is not None:
return r
nonlocal cnt
cnt += 1
if cnt == k:
return root.val
r = dfs(root.left)
if r is not None:
return r
return None
return dfs(root)
三、 701. 二叉搜索树中的插入操作
链接: 701. 二叉搜索树中的插入操作
1. 题目描述
2. 思路分析
按定义插入。
3. 代码实现
# 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 insertIntoBST(self, root: TreeNode, val: int) -> TreeNode:
if not root:
return TreeNode(val)
if val < root.val:
root.left = self.insertIntoBST(root.left,val)
else:
root.right = self.insertIntoBST(root.right,val)
return root
四、 面试题 04.05. 合法二叉搜索树
1. 题目描述
2. 思路分析
觉得做过1373. 二叉搜索子树的最大键值和
子树返回值需要有3个:
- 是否是BST。
- 左子树要最大值。
- 右子树要最小值。
3. 代码实现
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
def dfs(root):
if not root:
return True,float('inf'),-float('inf')
l,lmin,lmax = dfs(root.left)
r,rmin,rmax = dfs(root.right)
if l and r and lmax<root.val<rmin:
return True,root.val if not root.left else lmin,root.val if not root.right else rmax
return False,0,0
ret,_,_ = dfs(root)
return ret