跟着leedcode刷算法 -- 树1

183 阅读2分钟

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

image.png

题1

二叉搜索树中第K小的元素

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

示例 1:

image.png

  • 输入:root = [3,1,4,null,2], k = 1
  • 输出:1 示例 2:

image.png

  • 输入: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]

执行结果:

image.png

题2

二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

  示例 1:

image.png

  • 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
  • 输出:3
  • 解释:节点 5 和节点 1 的最近公共祖先是节点 3 。 示例 2:

image.png

  • 输入: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
        

执行结果:

image.png