Lowest Common Ancestor of a Binary Search Tree a Binary Tree

235. Lowest Common Ancestor of a Binary Search Tree

题目链接:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/#/description

题目大意:给定一棵二叉查找树和两个节点p和q,要求返回这两个节点的第一个公共祖先。

 

思路:对于当前节点node,如果p和q的val都大于node的val,则说明p和q的第一个公共祖先在node的右子树,如果p和q的val都小于node的val,则说明p和q的第一个公共祖先在node的左子树,否则node就是p和q的第一个公共祖先。

算法步骤:(1)如果root->val > max(p->val, q->val),令root = root->left,调回步骤(1),否则,如果root->val < min(p->val, q->val),令root = root->right,调回步骤(1),否则返回root。

 

算法复杂度:时间复杂度为O(log(n)),空间复杂度为O(1)

代码:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
13         while (true) {
14             if (root->val > max(p->val, q->val))
15                 root = root->left;
16             else if (root->val < min(p->val, q->val))
17                 root = root->right;
18             else
19                 return root;
20         }
21     }
22 };

评测系统上运行结果:

 

236. Lowest Common Ancestor of a Binary Tree

题目链接:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/#/description

题目大意:给定一棵二叉树和两个节点p和q,要求返回这两个节点的第一个公共祖先。

 

思路:如果p和q都在某节点的左边,就到左子树中查找共同祖先。若都在右边,则在右子树中查找共同祖先。如果p和q不在同一边,那就表示已经找到第一个共同祖先。

复杂度分析:时间复杂度为O(n),空间复杂度为O(n)

 

代码:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
13         if (!root || root == p || root == q)
14             return root;
15         auto left = lowestCommonAncestor(root->left, p, q);
16         auto right = lowestCommonAncestor(root->right, p, q);
17         if (left && right)
18             return root;
19         return left ? left : right;
20     }
21 };

评测系统上运行结果:

 

转载于:https://www.cnblogs.com/gxhblog/p/6660028.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

perl java_与Perl相比Java性能问题

我已经编写了一个Perl代码来处理大量CSV文件并获取输出,这需要0.8326秒才能完成.my $opname $ARGV[0];my files find . -name "*${opname}*.csv";mtime -10 -type f;my %hash;foreach my $file (files) {chomp $file;my $time $file;$time ~ s/.*\~(.*?)\..*/$1/…

controller调用另一个controller中的方法 获取返回值_必须掌握!你知道 Spring 中运用的 9 种设计模式吗 ?...

Spring中涉及的设计模式总结&#xff0c;在面试中也会经常问道 Spring 中设计模式的问题。本文以实现方式、实质、实现原理的结构简单介绍 Sping 中应用的 9 种设计模型&#xff0c;具体详细的刨析会在后面的文章发布&#xff0c;话不多说&#xff0c;来个转发、在看、收藏三连…

我个人的CRUD故事-或我如何来到CUBA平台

在此博客文章中&#xff0c;我想介绍一下我如何使用CUBA平台以及此工具的好处。 在我年轻的“业务应用程序开发”历史上&#xff0c;我将深入探讨不同的阶段&#xff0c;只为您提供一些背景知识。 因此&#xff0c;让我们从如何进入典型的CRUD应用程序开始&#xff0c;以帮助非…

MySQL分库分表环境下全局ID生成方案

转自&#xff1a;https://my.oschina.net/u/142836/blog/174465 在大型互联网应用中&#xff0c;随着用户数的增加&#xff0c;为了提高应用的性能&#xff0c;我们经常需要对数据库进行分库分表操作。在单表时代&#xff0c;我们可以完全依赖于数据库的自增ID来唯一标识一个用…

java 不定参数方法_java中不定长参数的使用方法

java中不定长参数的使用方法不定长参数方法的语法如下&#xff1a;返回值 方法名(参数类型...参数名称)在参数列表中使用“...”形式定义不定长参数&#xff0c;其实这个不定长参数a就是一个数组&#xff0c;编译器会将(int...a)这种形式看作是(int[] a)的形式。示例&#xff1…

光盘刻录只允许读取不能拷贝_原来 8 张图,就可以搞懂「零拷贝」了

作者 | 小林coding来源 | 小林coding(ID&#xff1a;CodingLin)前言磁盘可以说是计算机系统最慢的硬件之一&#xff0c;读写速度相差内存 10 倍以上&#xff0c;所以针对优化磁盘的技术非常的多&#xff0c;比如零拷贝、直接 I/O、异步 I/O 等等&#xff0c;这些优化的目的就是…

如何:带有Thymeleaf和Spring Boot的Java 8日期和时间

如果您碰巧使用Spring Boot和Thymeleaf&#xff0c;并且需要在视图中格式化Java 8 Date&#xff06;Time对象&#xff0c;则可以使用thymeleaf-extras-java8time –用于Java 8 Date&#xff06;Time API的Thymeleaf模块。 向现有的基于Maven或Gradle的Spring Boot项目中添加th…

纯java分布式内存数据库_最新Java岗面试清单:分布式+Dubbo+线程+Redis+数据库+JVM+并发...

最近可能有点闲的慌&#xff0c;没事就去找面试面经&#xff0c;整理了一波面试题。我大概是分成了Java基础、中级、高级&#xff0c;分布式&#xff0c;Spring架构&#xff0c;多线程&#xff0c;网络&#xff0c;MySQL&#xff0c;Redis缓存&#xff0c;JVM相关&#xff0c;调…

c++ 多核cpu序列号_详解CPU几个重点基础知识

作者 | 骏马金龙责编 | 阿秃关于CPU和程序的执行1、程序的运行过程&#xff0c;实际上是程序涉及到的、未涉及到的一大堆的指令的执行过程。当程序要执行的部分被装载到内存后&#xff0c;CPU要从内存中取出指令&#xff0c;然后指令解码(以便知道类型和操作数&#xff0c;简单…

5.8上午

数学分册基础概念 转载于:https://www.cnblogs.com/yanyuying/p/6828791.html

java log4j 写日志_Java log4j同时写入文本日志和数据库日志

版权声明&#xff1a;转载原创文章请以超链接形式请注明原文章出处&#xff0c;尊重作者&#xff0c;尊重原创&#xff01;恰饭广告Log4jUtil.javaimport org.apache.log4j.Logger;import org.apache.log4j.MDC;public class Log4jUtil {private static Logger logger Logger.…

订单生产计划表范本_工厂生产管理为什么需要ERP软件?

对于工厂来说&#xff0c;规模大了&#xff0c;管理问题也就随之多了&#xff0c;在工厂生产流程中&#xff0c;我们常见的一些生产现象&#xff0c;比如生产计划表徒具形式、各生产部门半成品堆积、生产计划达标率低、前后工序原材料或半成品衔接不上、经常追加或取消生产计划…

codeforces 701 E. Connecting Universities(树+ 边的贡献)

题目链接&#xff1a;http://codeforces.com/contest/701/problem/E 题意&#xff1a;有n个城市构成一棵树&#xff0c;一个城市最多有一个学校&#xff0c;这n个城市一共2*k个学校&#xff0c;要对这2*k个学校进行连边&#xff0c;使得所有连出来的边的和最大&#xff0c;每条…

拜托,Java。 最终是否支持多行字符串文字

我了解Java语言的思想很难以向后兼容的方式进行维护。 我知道JDK API&#xff08;例如集合&#xff09;的想法很难打破。 是。 我不明白为什么Java 仍然没有多行字符串文字。 您多久编写一次这样的JDBC代码&#xff08;或您想嵌入Java的任何其他外部语言或标记&#xff0c;例…

java memorystream 包_MemoryStream

MemoryStream位于System.IO命名空间&#xff0c;为系统内存提供流式的读写操作。常作为其他流数据交换时的中间对象操作。1、MemoryStream类封装一个字节数组&#xff0c;在构造实例时可以使用一个字节数组作为参数&#xff0c;但是数组的长度无法调整。使用默认无参数构造函数…

网站pc端分享QQ好友,空间,微博

在开发pc端网站的过程中&#xff0c;涉及到邀请好友的功能&#xff0c;之前单纯的复制粘贴已经无法满足用户的体验。故&#xff0c;仿照移动端添加自动分享到QQ好友&#xff0c;QQ空间&#xff0c;QQ微博的功能。 分享到QQ好友&#xff1a;http://connect.qq.com/widget/shareq…

python如果选择不在列表里_Python-list.remove(x)x不在列表中

我正在尝试在Python 3.3中创建一个简单的程序,该程序采用四个名称的列表,并将它们随机分配给列表中的另一个人.例如,如果名称是John,Aaron,Lydia和Robin&#xff1a; 约翰先走,然后选择一个名字.他不能画自己的东西.如果他这样做,他会把它放回去并再次抽签.说约翰画了罗宾的名字…

P1266 速度限制

速度限制 洛谷链接 题目大意&#xff1a; 在一个城市中&#xff0c;每条道路有限速和长度&#xff0c;通过一条道路的时间为这条道路的长度除以限制的速度&#xff0c;有的道路不知道限速为多少&#xff0c;那么就按现在的速度走这条路&#xff0c;找出从第一个点到目标点的最短…

dbunit测试dao_用于数据库测试的DBUnit,Spring和注释

dbunit测试dao如果您曾经尝试用Java编写数据库测试&#xff0c;则可能会遇到DBUnit 。 DBUnit允许您设置和拆除数据库&#xff0c;以便它包含可针对其编写测试的一致行。 通常&#xff0c;您可以通过编写一个简单的XML文档来指定要DBUnit插入的行&#xff0c;例如&#xff1a; …

python自动化之正则

import re phoneNumRegexre.compile(r\d\d\d-\d\d\d-\d\d\d\d) mophoneNumRegex.search(My number is 415-555-4242.) print(Phone number found: mo.group()) #######利用括号分组############## phoneNumRegexre.compile(r(\d\d\d)-(\d\d\d-\d\d\d\d)) mophoneNumRegex.searc…