算法:二叉搜索树的最近公共祖先

问题

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

解决

//1、两次遍历
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        TreeNode current=root;
        List p_path=reNodePath(current,p);
        List q_path=reNodePath(current,q);
        TreeNode now=null;
        int len1=Math.min(q_path.size(),p_path.size());
        for(int i=0;i reNodePath(TreeNode root,TreeNode targer){
        List path=new ArrayList();
        while(root!=targer){
            path.add(root);
            if(targer.val

算法:二叉搜索树的最近公共祖先

//2、一次遍历:当便利到目标结点的时候,q、p一定在目标结点的两边
class Solution{
    public TreeNode lowestCommonAncestor(TreeNode root,TreeNode q,TreeNode p){
        TreeNode cur=root;
        while(true){
            if(q.valcur.val&&p.val>cur.val){
                cur=cur.right;
            }
            else{
                break;
            }
        }
        return cur;
    }
}

算法:二叉搜索树的最近公共祖先

//3、递归
class Solution{
    public TreeNode lowestCommonAncestor(TreeNode root,TreeNode q,TreeNode p){
        if(q.valroot.val&&p.val>root.val) return lowestCommonAncestor(root.right,q,p);
        return root;
    }
}

时间复杂度:O(N)
空间复杂度:O(N)

总结:

  • 三种方法都是根据二叉搜索树的性质来,从路径出发找到最终结点。

Original: https://www.cnblogs.com/zhangsanM/p/16567991.html
Author: new_monkey
Title: 算法:二叉搜索树的最近公共祖先

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/605175/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 0020:[NOIP2000 提高组] 进制转换-uf0_金币灰黄

    题目链接: https://www.luogu.com.cn/problem/P1017 题目描述:读入一个十进制数和一个负进制数的基数, 并将此十进制数转换为此负进制下的数 可能…

    数据结构和算法 2023年6月12日
    066
  • 初识C++01:初探C++

    c++介绍 c++支持面向过程编程(如c),面向对象编程(OOP)和泛型编程; c/c++编译器比较多,window下是微软编译器cl.exe,Linux机下是GCC编译器,mac…

    数据结构和算法 2023年6月12日
    086
  • AcWing 1252. 搭配购买(并查集+01背包)

    题目描述 题目链接 题目思路 把所有有边相连的点合并在一起,并且维护总体积和总价值 把每个连通块看成一个物品,之后做一遍01背包 时间复杂度:O(nw) 题目代码 #include…

    数据结构和算法 2023年6月16日
    066
  • 提问的智慧

    许多项目在他们的使用协助/说明网页中链接了本指南,这么做很好,我们也鼓励大家都这么做。但如果你是负责管理这个项目网页的人,请在超链接附近的显著位置上注明: 本指南不提供此项目的实际…

    数据结构和算法 2023年6月16日
    0100
  • [题解]Balance

    1.题目 2.题目大意 一个天平上有一些钩子,现在有一些砝码。给出每个钩子到原点(姑且这么叫吧)的距离(-15 ~ 15,负数代表在左边,正数相反)以及砝码的重量(1 ~ 20),…

    数据结构和算法 2023年6月8日
    0112
  • 创建链表并且遍历链表

    class ListNode { //类名 :Java类就是一种自定义的数据结构 int val; //数据 :节点数据 ListNode next; //对象 :引用下一个节点对…

    数据结构和算法 2023年6月16日
    0121
  • 2022.7.21 特殊矩阵压缩

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月8日
    060
  • 「题解」锦鲤序列

    (锦鲤:为何如此之晦……) 「锦鲤序列的长度一定是 奇数,前 (n+1) 个数一定是 严格单调递增的,后 (n+1) 个数一定是 严格单调递减的,找到这个整…

    数据结构和算法 2023年6月8日
    092
  • C. Divisors of the Divisors of An Integer(质因数分解,数论) 2018-2019 ACM-ICPC, Asia Dhaka Regional Contest

    ​ 给出(n(1e6)),请问(n!)的 因子的因子的个数。 ​ 因子的个数求解不难,可以知道是质因数分解。 ​ 对于一个质因数(P_i^{k}),可以知道其因子的数量的是((k …

    数据结构和算法 2023年6月12日
    054
  • 蓝桥杯-分果果

    小蓝要在自己的生日宴会上将 (n) 包糖果分给 (m) 个小朋友。每包糖果都要分出去,每个小朋友至少要分一包,也可以分多包。 小蓝已经提前将糖果准备好了,为了在宴会当天能把糖果分得…

    数据结构和算法 2023年6月12日
    072
  • 数据结构与算法工具类自用(不定时更新)

    目前针对基础的整数排序问题和数组较为实用。 public class AlgoUtils { /** * 对数器, 返回int数组 * @param maxLen 数组长度范围[0…

    数据结构和算法 2023年6月16日
    076
  • 新的开始

    一直想要写博客来记录和分享自己的学习,所以今天是值得纪念的一天。写博客也是督促我学习吧。下周开始会正式开始写 数据结构也会分享有关数据库和Java的相关知识自己是个小菜狗,所以想要…

    数据结构和算法 2023年6月7日
    088
  • CF1467C Three Bags

    传送门 思路:对于一般情况,我们有三个袋子,容易想到把袋子里物品的价值排序。然后贪心,我们想让最后的价值最大,则三个袋子最后都可以剩余一个物品,这三个物品总和需要最大,最好的情况就…

    数据结构和算法 2023年6月7日
    0103
  • 十大排序算法-冒泡排序

    从前往后,相邻元素两两比较,不断将最大的值交换到列表未排序的最末尾,下一次重新开始比较时就不需要和已排序的比较了。 算法步骤: 比较相邻的元素。如果第一个比第二个大,就交换他们两个…

    数据结构和算法 2023年6月12日
    061
  • git实用指南

    个人整理的一些常用的 Git 概念和命令集合,方便速查和快速解决某些场景下的问题,覆盖了日常开发和协同工作下的一部分场景,不只是命令行的介绍。欢迎关注语雀原文,持续更新! 掘金-阿…

    数据结构和算法 2023年6月8日
    069
  • 01 入门 | 数据结构与算法

    数据结构基本概念 数据 数据:数据是指对客观事物进行记录并且可以鉴别的 抽象符号 数据元素:数据的 基本单位,在计算机当中作为一个整体考虑 数据对象:具有相同性质的数据元素的集合 …

    数据结构和算法 2023年6月12日
    097
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球