代码随想录刷题笔记-Day20

1. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先icon-default.png?t=N7T8https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/

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

百度百科中最近公共祖先的定义为:“对于有根树 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 。因为根据定义最近公共祖先节点可以为节点本身。

 解题思路

找祖先,涉及到回溯,所以要使用中序递归。

考虑递归的三要素:

  • 参数:当前节点root,q和p两个要找的节点
  • 返回值:boolean,当子树包含q的时候返回True,否则返回false
  • 终止条件:root为null的时候,返回false
  • 递归逻辑:无法提前终止,当左右都返回True的时候,可以确定祖先,但是,祖先的上一层无法判断是只有一个还是两个了。所以需要一个TreeNode来保存祖先。

代码

class Solution {
    TreeNode ancestor = null;

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        findAncestor(root, p, q);
        return ancestor;
    }

    public boolean findAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null)
            return false;
        boolean cur = root == p || root == q;
        boolean left = findAncestor(root.left, p, q);
        boolean right = findAncestor(root.right, p, q);
        int count = 0;
        if (cur)
            count++;
        if (left)
            count++;
        if (right)
            count++;
        if (count == 2)
            ancestor = root;
        return left || right || cur;
    }
}

2. 二叉搜索树的最近公共祖先

235. 二叉搜索树的最近公共祖先icon-default.png?t=N7T8https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/

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

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

例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

示例 1:

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

示例 2:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。

解题思路

二叉搜索树肯定比普通的二叉树有优化的地方,二叉搜索树的公共祖先一定是位于p和q的中间的,并且只有一个这样的祖先,因为再网上就又变成了位于两边了。

  • 参数:root,p,q
  • 返回值:返回找到的位于中间的节点
  • 终止条件:位于中间的时候,返回root
  • 递归逻辑:小于min的时候走右侧,大于max的时候走左侧
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root.val > Math.max(p.val, q.val))
            return lowestCommonAncestor(root.left, p, q);
        else if (root.val < Math.min(p.val, q.val))
            return lowestCommonAncestor(root.right, p, q);
        else
            return root;
    }
}

相关推荐

  1. 代码随想笔记Day36

    2024-02-22 00:26:04       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-22 00:26:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-22 00:26:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-22 00:26:04       82 阅读
  4. Python语言-面向对象

    2024-02-22 00:26:04       91 阅读

热门阅读

  1. SQL语句分为以下三种类型

    2024-02-22 00:26:04       49 阅读
  2. Python 机器学习 决策树 分类原理

    2024-02-22 00:26:04       54 阅读
  3. C#程序反编译经验总结

    2024-02-22 00:26:04       49 阅读
  4. React 的发展历史一览

    2024-02-22 00:26:04       51 阅读
  5. 工具栏和菜单栏的关系是什么?

    2024-02-22 00:26:04       66 阅读
  6. 表空间查询sql

    2024-02-22 00:26:04       46 阅读
  7. 工作记录之策略模式

    2024-02-22 00:26:04       49 阅读
  8. 代码随想录三刷day04

    2024-02-22 00:26:04       54 阅读
  9. kali kvm

    2024-02-22 00:26:04       56 阅读
  10. QT3作业

    QT3作业

    2024-02-22 00:26:04      45 阅读
  11. 通过Redis增减库存避坑

    2024-02-22 00:26:04       53 阅读