LCA(最近公共祖先)算法的逻辑是基于递归的思想来实现的。在这个代码中,我们使用分治策略来寻找给定节点 p 和 q 的最近公共祖先。具体原理如下:

  1. 如果当前根节点为 -1,表示树为空,返回 -1,表示当前子树中没有找到 p 或 q。

  1. 如果当前根节点是 p 或 q,说明找到了其中一个节点,返回根节点。这是因为一旦找到其中一个节点,它本身就是另一个节点的祖先(如果另一个节点在当前子树中)。

  1. 递归地在左右子树中查找 LCA。

  1. 如果左子树和右子树都有结果(即都不为 -1),说明 p 和 q 分别位于当前根节点的左右两侧,因此当前根节点就是最近公共祖先。

  1. 如果只有左子树有结果(即右子树结果为 -1),说明 LCA 在左子树中,返回左子树的结果。

  1. 如果只有右子树有结果(即左子树结果为 -1),说明 LCA 在右子树中,返回右子树的结果。

通过这种方法,我们将问题不断地划分成更小的子问题,直到找到给定节点的最近公共祖先。

这种算法能找到最近公共祖先的原因是,当我们从上至下遍历二叉树时,我们沿着树的边界向下寻找给定节点。当找到 p 和 q 的一个公共祖先时,这个公共祖先一定是最近的,因为我们是从根节点开始搜索的。当我们找到一个公共祖先后,搜索过程就停止了,因为我们已经找到了最近的公共祖先。

题目:https://sunnywhy.com/sfbj/9/2/339

Sunny why
#include <iostream>
#include <vector>
using namespace std;const int MAXN = 51;struct Node{int l,r;
}nodes[MAXN];int LCA(int root, int p, int q){if(root == -1) return -1;else if(root == p || root == q) return root;// 如果根节点是 p 或 q,说明找到了其中一个节点,返回根节点int leftResult = LCA(nodes[root].l, p ,q );int rightResult = LCA(nodes[root].r, p, q);if(leftResult != -1 && rightResult != -1){return root;}else if(leftResult != -1){return leftResult;} else{return rightResult;}
}int main(){int n,p,q,L,R;cin >> n >> p >> q;for (int i = 0; i < n; ++i) {cin >> L >> R;nodes[i].l = L;nodes[i].r = R;}cout << LCA(0, p, q);
}

二叉树 最小公共祖先 c++版相关推荐

  1. LeetCode 2096. 从二叉树一个节点到另一个节点每一步的方向(最小公共祖先)

    文章目录 1. 题目 2. 解题 1. 题目 给你一棵 二叉树 的根节点 root ,这棵二叉树总共有 n 个节点. 每个节点的值为 1 到 n 中的一个整数,且互不相同. 给你一个整数 startV ...

  2. 两节点的最小公共祖先LCA

    一.二叉搜索树中两节点的最小公共祖先: 最初级的题目,在一颗二叉搜索树中寻找两节点的最小公共祖先.根据二叉搜索树的特征,从根节点开始查找,若两节点的val值都小于当前节点,则他们的最小公共祖先就去左子 ...

  3. 二叉树的公共祖先问题

    二刷随想录的时候发现,二叉树的公共祖先问题有一个点很巧妙,在这里记录下来,也作为之后复习用的笔记. 记录内容就以随想录的两道题为主. 1.二叉树的最近公共祖先 对应题目236. 二叉树的最近公共祖先 ...

  4. 二叉树最近公共祖先节点

    寻找最近公共祖先节点(LCA) 在一棵二叉树中,对于节点X和节点Y,X和Y的LCA是这棵树中X和Y的第一个共同祖先.寻找公共节点的算法思路很简单:对于节点x和y,找到树的根节点分别到x节点和y节点的路 ...

  5. 二叉树最近公共祖先相关题目(Leetcode题解-Python语言)

    236. 二叉树的最近公共祖先 class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'T ...

  6. [Leedcode][JAVA][第236题][二叉树的公共祖先][后序遍历][BFS]

    [问题描述] 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先.百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p. ...

  7. 二叉树经典题之二叉树最近公共祖先(LeetCode)

    前言: 二叉树刷题是有固定思维的,请移步 README]二叉树刷题框架 文章目录 前言: 二叉树的最近公共祖先 思路一 思路 代码 思路二 思路 代码 二叉树的最近公共祖先 题目 点击跳转:LeetC ...

  8. 二叉树最近公共祖先 LCA

    题目: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 ...

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

    什么是二叉搜索树? 对于二叉树的任意一个节点n: (1)其左子树下的每个节点的值都小于节点n的值: (2)其左子树下的每个节点的值都大于节点n的值: 思路与算法 从根节点开始遍历: 如果当前节点的值大 ...

最新文章

  1. Python+Django+SAE系列教程14-----使表单更安全
  2. c语言 游戏程序,C语言做的推箱子游戏源程序
  3. jpanel网格布局添加滚动条_啥是前端开发工程师必会的5种网页布局方式?
  4. 《C和指针》——C语言字符串操作
  5. matlab如何绘制传递函数对数幅频特性_开环传递函数是怎样影响系统的?重要参量1/(1+T)与T/(1+T)的释义...
  6. java二级分销排行统计_直播分销系统排行
  7. MySQL 5.1.45 GA 发布
  8. Azure角色管理技巧和工具
  9. LayUI树形表格treetable使用详解
  10. 大数据如何可以推动员工敬业度
  11. ESP32核心原理图
  12. APP界面设计流程和APP产品设计流程知识汇总
  13. 数学之美(Beauty Of Mathematics)
  14. android 自定义textview在onlayout中设置setTypeface的时候报错 requestLayout() improperly called by ...
  15. Error: couldn‘t connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error
  16. PDL格式解决方案Aspose.Page重磅上新!两大文档格式功能助力文档管理!
  17. 为什么华为、阿里、字节跳动、微软等都走上了云原生和数字化之路?
  18. 宕机三个月、36亿打水漂,印度骄傲Infosys如何活成了全球笑话?
  19. python调用百度网盘开放平台接口上传本地文件
  20. 人在旅途——》张家界之旅:20190422

热门文章

  1. 一场先进技术与先锋企业碰撞的知识盛宴!弘玑Cyclone『超级自动化的数字内生力量』CXO私享会成功举办
  2. 在这领工资,一辈子别想取媳妇了!
  3. 【文件格式探究】EP.1 对ePub文件格式的初探
  4. 如何查看计算机所连接的打印机
  5. 西南石油大学计科院主页
  6. 【踩坑】mirai登陆失败反复验证码或提示登录存在安全风险或提示版本过低的解决方法
  7. 火山PC编辑框组件详解3
  8. 文华学院大学计算机基础考试数据库ip,文华学院大学计算机基础模拟试卷
  9. 阈的粤语发音_新编粤语读音字典 - 粤语 | Cantonese | 白话 - 声同小语种论坛 - Powered by phpwind...
  10. iPhone软件开发完美起步