HO49-二叉树的最近公共祖先

news2024/11/15 8:17:09

        leetcode原题链接:二叉树的最近公共祖先

题目描述

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

百度百科中最近公共祖先的定义为:“对于有根树 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 均存在于给定的二叉树中。

解题方法:分别在左右子树中查找p或者q,判断p或者q的位置:

1.  如果p和q分别在root的左、右子树中,则root即为最近公共祖先。

2. 如果p和q在root的左子树中,则在root->left子树中查找最近公共祖先。

3. 如果p和q在root的右子树中,则在root->right子树中查找最近公共祖先。

C++代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (!root || !p | !q) {
            return nullptr;
        }
        if (root == p || root == q) {
            return root;
        }
        TreeNode* left_res = lowestCommonAncestor(root->left, p, q);//在左子树中查找q或p
        TreeNode* right_res = lowestCommonAncestor(root->right, p, q);//在右子树中查找q或p
        if (left_res && right_res) { //p和q分布在root的左、右子树中
            return root;
        }
        if (!left_res) { //p或者q不在左子树中(则必然在右子树中)
            return right_res;
        }
        if (!right_res) {//p或者q不在右子树中(则必然在左子树中)
            return left_res;
        }
        return root;
    }
};

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

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

相关文章

Linux中的GO更新与冲突

发行版&#xff1a;CentOS GO更新 在使用go get安装某模块时&#xff0c;报错&#xff1a; ../../pkg/mod/golang.org/x/sysv0.5.0/unix/syscall.go:83:16: undefined: unsafe.Slice ../../pkg/mod/golang.org/x/sysv0.5.0/unix/syscall_linux.go:2271:9: undefined: unsafe.…

Verilog学习笔记5:简单的加法器

代码&#xff1a; //加法器 timescale 1ns/10ps module add( a, b, y ); input a; input b; output[1:0] y;assign yab;endmodule //testbench module add_tb; reg a; reg b; wire[1:0] y;add add(.a(a),.b(b),.y(y));initial begina<0;b<0;#10 a<1;b<0;#10 a&l…

SpringMVC 中的视图如何渲染模型数据

SpringMVC 中的视图如何渲染模型数据 SpringMVC 是一个基于 Spring 框架的 Web 框架&#xff0c;它提供了一种方便的方式来处理 HTTP 请求和响应。在 SpringMVC 中&#xff0c;视图是用来渲染模型数据的组件&#xff0c;它们负责将模型数据转换为 HTML、JSON、XML 等格式的响应…

风沙文字粒子制作

目录 一、导入素材 二、合成介绍 三、文字合成新建和制作 四、文字动画合成新建和制作 五、风沙文字消失合成的新建和制作 六、风沙文字消失合成制作完成 七、制作风沙文字出现合成 风沙文字粒子效果如下&#xff1a; AE模板风沙文字粒子宣传片片头片尾 一、导入素材 打…

Windows server 2012服务器远程桌面登录时出现错误提示:“由于没有远程桌面授权服务器可以提供许可证,远程会话被中断

简单粗暴&#xff1a; Windows server 2012服务器远程桌面登录时出现错误提示&#xff1a;“由于没有远程桌面授权服务器可以提供许可证&#xff0c;远程会话被中断。请跟服务器管理员联系 使用 mstsc /admin /v:目标ip 来强制登录服务器&#xff0c;但只能是管理员身份…

最简单的大屏可视化解决方案---autofit.js

在工作开发当中&#xff0c;我们避免不了要去做大屏。那么做大屏其实最难的点和最核心的问题就是适配&#xff0c; 下面为大家介绍最好用的大屏解决方案——autofit.js。 “一行代码搞定&#xff0c;开袋即食&#xff01;&#xff01;&#xff01;” 效果图展示&#xff0c;…

第4章-面向对象编程(上)

1. 面向过程与面向对象 面向过程 面向对象 2. 面向对象的思想概述 类(Class)和对象(Object)是面向对象的核心概念 类是对一类事物的描述&#xff0c;是抽象的、概念上的定义对象是实际存在的该类事物的每个个体&#xff0c;因而也称为实例(instance)属性&#xff1a;对应类…

Microsoft Remote Desktop for mac安装教程

适用于Mac的Microsoft远程桌面测试版&#xff01;Microsoft Remote Desktop Beta for Mac是一种远程工具&#xff0c;允许用户从Mac远程访问基于Windows的计算机。使用此工具&#xff0c;用户可以随时随地使用Mac连接到远程桌面、应用程序和资源。 Microsoft Remote Desktop B…

分享一下快速搭建IntelliJ IDEA开发环境的完整教程

目录 第一步&#xff1a;安装jdk&#xff0c;推荐安装jdk1.8 第二步&#xff1a;安装Maven 第三步&#xff1a;配置环境变量 1、jdk环境变量配置 2、maven环境变量配置 第四步&#xff1a;修改Maven仓库的地址 第五步&#xff1a;修改idea设置 IntelliJ IDEA是我们Java程…

云原生之深入解析K8S 1.24的高可用环境部署

一、Kubernetes 1.24 版本发布及重磅改动 2022 年 5 月 3 日&#xff0c;Kubernetes 1.24 正式发布&#xff0c;在新版本中&#xff0c;可以看到 Kubernetes 作为容器编排的事实标准&#xff0c;正愈发变得成熟&#xff0c;有 12 项功能都更新到了稳定版本&#xff0c;同时引入…

如何在windows上安装Openssl环境

首先在链接下载openssl安装版 openssl windows 我选择的是肥一点的版本 然后就是按向导步骤安装。 安装完后&#xff0c;首先要先设置下环境变量 我安装的路径是 C:\Program Files\OpenSSL-Win64\bin接下来&#xff0c;我以我的windows11为例说明&#xff0c; 在任务栏开始…

快使用双截棍 | 低码之数据模型 元服务开发的奇门武器

中国武术博大精深&#xff0c;刀枪棍棒层出不穷。从中国古代流传下来的一件奇门武器&#xff0c;软中带硬&#xff0c;柔中有钢&#xff0c;名叫双节棍&#xff0c;又名双截棍。双截棍短小精悍&#xff0c;携带方便&#xff0c;普通人也可以打出160斤以上的力道&#xff0c;威力…

【项目一】IO库对比、文件操作

文章目录 1.17 标准C库IO函数和Linux系统IO函数对比1.18 虚拟地址空间1.19 文件描述符1.20 open打开文件1.20 open创建文件1.22 read、write函数1.23 lseek函数1.24 stat、lstat函数1.25 使用stat函数模拟实现 ls -l 命令1.26 文件属性操作函数1.27 目录操作函数1.28 目录遍历函…

linux 乱码

在 Linux 中遇到乱码问题通常是由于字符编码不正确导致的。以下是几种常见的乱码情况以及相应的解决方法&#xff1a; 1、终端乱码&#xff1a;如果在终端中出现了乱码&#xff0c;可以尝试以下方法来解决&#xff1a; 检查终端的字符编码设置&#xff1a;确保终端的字符编码…

18 MFC TCP和UDP 网络通信

文章目录 TCP服务器TCP客户端UDP 服务器UDP客户端MFC TCP通信TCP服务器TCP 客户端 MFC UDP通信 TCP服务器 #include <stdio.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") //包含静态库/* .obj .lib 文件 组合打包成 .exe */int main()…

申请和注销设备号的方法

一、Linux内核对设备的分类 linux的文件种类&#xff1a; -&#xff1a;普通文件 d&#xff1a;目录文件 p&#xff1a;管道文件 s&#xff1a;本地socket文件 l&#xff1a;链接文件 c&#xff1a;字符设备 b&#xff1a;块设备 Linux内核按驱动程序实现模型框架的不…

【C/C++练习】经典的排列组合问题(回溯算法)——电话号码的字母组合

&#x1f4d6;题目描述 题目出处&#xff1a;电话号码的字母组合 示例&#xff1a; &#x1f4d6;题解  这是一道典型的排列组合问题&#xff0c;根据输入&#xff0c;我们需要找到所有的组合。下面以输入字符串digits "23"为例来讲解这道题目。 图解&#xff1…

Java入门到入土(集合篇)

前言 初出茅庐 Collection集合特点 Map集合特点 牛刀小试 List集合用法 迭代器原理 Set集合用法 Map集合用法 追根溯源 List集合解析 Set集合解析 Map集合解析 结束语 前言 Java中用来批量存储数据的方式有…

mac 怎么批量修改文件后缀?

mac 批量修改文件后缀的方法教程~平时在电脑上使用文件的时候&#xff0c;经常需要对文件的后缀名进行修改&#xff0c;文件后缀名也就是文件扩展名&#xff0c;如果仅是单纯的修改文件后缀名&#xff0c;并不涉及格式转换的情况下&#xff0c;其实方法很简单&#xff0c;只需要…

ZBrush 3D游戏建模教程:创建女武士模型

推荐&#xff1a;将NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a;NSDT简石数字孪生 介绍 在本教程中&#xff0c;演示创建实时武士角色的流程&#xff0c;该流程基于 Kati Sarin S 的原始概念。我将使用各种各样的软件&#xff0c;如ZBrush&#xff0c;Maya&#xff…