这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战
题1
二叉搜索树中第K小的元素
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例 1:
- 输入:root = [3,1,4,null,2], k = 1
- 输出:1 示例 2:
- 输入:root = [5,3,6,2,4,null,null,1], k = 3
- 输出:3
提示:
- 树中的节点数为 n 。
- 1 <= k <= n <= 104
- 0 <= Node.val <= 104
进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?
相关标签
- 树
- 深度优先搜索
- 二叉搜索树
- 二叉树
解题思路: 二叉搜索树的中序遍历
# 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 kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
nums = []
def dfs(root):
if not root:
return
dfs(root.left)
nums.append(root.val)
dfs(root.right)
dfs(root)
return nums[k-1]
执行结果:
题2
二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 1:
- 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
- 输出:3
- 解释:节点 5 和节点 1 的最近公共祖先是节点 3 。 示例 2:
-
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
-
输出:5
-
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。 示例 3:
-
输入:root = [1,2], p = 1, q = 2
-
输出:1 提示:
-
树中节点数目在范围 [2, 105] 内。
-
-109 <= Node.val <= 109
-
所有 Node.val 互不相同 。
-
p != q
-
p 和 q 均存在于给定的二叉树中。 相关标签
-
树
-
深度优先搜索
-
二叉树
没什么太好的思路,就是一个大众的想法,深度优先搜索的方法,左侧先遍历,判断是否都在左侧 不在就遍历右侧,右侧没有就判断是否存在所有的树种,都没有,那就返回 root
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if root is p or root is q:
return root
if not root:
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if left and right:
return root
if not right:
return left
if not left:
return right
执行结果: