寻找二叉树公共祖先结点递归实现

简介: 寻找二叉树公共祖先结点递归实现寻找二叉树公共祖先结点递归实现
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
/*寻找公共祖先结点LCA算法de思想:
第零种情况:root为null时直接return
第一种情况:如果p在左子树q在右子树或反之则root为LCA
第二种情况:p和q均在左子树(LCA递归左子树)
第三种情况:p和q均在右子树(LCA递归右子树)
PS:最后return的right和left不会同时为NULL
*/
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL||root==p||root==q) return root;
        TreeNode* left=lowestCommonAncestor(root->left,p,q);
        TreeNode* right=lowestCommonAncestor(root->right,p,q);
        if(left && right){
            return root; 
        }else{
            return left==NULL?right:left;
        }
    }
};

image.png

image.png

/**
 * 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 == NULL || root == p || root == q){
            return root;
        }
        //将题目简化为查找以root为根结点的二叉树上是否有p或q节点,有则返回root
        //递归左子树
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        //递归右子树
        TreeNode* right = lowestCommonAncestor(root->right, p, q);
        if(left && right){
            //左右子树上均能找到p或q,即p和q分居左右子树,直接返回root
            return root;
        }else{
            //最后的right和left不会同时为NULL
            return left == NULL? right: left;
        }
    }
};
相关文章
|
监控 文字识别 物联网
这是我写的实施一地两检的跨境高铁站旅客资料预报系统的系统架构
本系统参考民航APIS设计,实现青青草原国高铁跨境旅客资料预报与行程监控。通过铁路与移民管理部门数据联动,完成旅客购票、检票、乘车及退票等全流程边检预报与身份验证,保障一地两检高效合规运行。
469 2
|
机器学习/深度学习 人工智能 监控
2000 张人脸眼部检测数据集 | 标注规范、数据划分与应用场景
本 人脸眼部检测数据集(2000 张图片已划分、已标注),以中小规模的精细化标注为核心,兼顾多样性与实用性,能够满足从学术研究到工程落地的多种需求。无论是初学者进行深度学习实验,还是科研人员做算法对比,抑或企业在产品开发阶段进行原型验证,该数据集都能提供坚实的数据支撑。
|
数据采集 分布式计算 大数据
Pandas数据清洗:缺失值处理
本文详细介绍了Pandas库中处理缺失值的方法,包括检测缺失值、删除缺失值、填充缺失值和插值法填充缺失值。通过基础概念和代码示例,帮助读者理解和解决数据清洗中常见的缺失值问题。
1406 80
|
Oracle 关系型数据库 Java
银河麒麟v10安装达梦数据库
银河麒麟v10安装达梦数据库
3019 1
|
存储 关系型数据库 MySQL
【高频】什么是索引的下推和覆盖
【高频】什么是索引的下推和覆盖
1068 2
|
测试技术 调度 C语言
大并发下的高性能编程 – 改进的(用户态)自旋锁
前言 多线程程序中,锁的使用往往成为系统性能的关键。在做地址可视化项目的时候,由于内存管理部分需要频繁的更新内存的引用计数,所以产生了使用自旋锁的想法,这篇文章我们从自旋锁的性能开始说起,由浅入深的给出了一种改进的自旋锁的实现。
2406 0
|
搜索推荐
查找-之二叉排序树(查找、插入、删除)
有序的线性表采用:折半/二分、插值、斐波那契查找相比顺序查找效率得到提高,但是在插入和删除时效率低(为维持数据的有序性) 在高效实现查找操作时,如何提高插入和删除的效率? 在一些应用场景:在查找时需要插入和删除
723 0
查找-之二叉排序树(查找、插入、删除)
|
存储 算法
【数据结构】3个例题带你理解图的遍历:深度优先搜索
【数据结构】3个例题带你理解图的遍历:深度优先搜索
3249 0
【数据结构】3个例题带你理解图的遍历:深度优先搜索
|
机器学习/深度学习 算法框架/工具 计算机视觉
经典神经网络 | ResNet 论文解析及代码实现
经典神经网络 | ResNet 论文解析及代码实现
经典神经网络 | ResNet 论文解析及代码实现
|
弹性计算 数据采集 前端开发
阿里云服务器双11配置仅需85元/年
阿里云服务器双11配置仅需85元/年
阿里云服务器双11配置仅需85元/年

热门文章

最新文章