在二叉树中找到两个节点的最近公共祖先(NC102/考察次数Top25/难度中等)

Posted 码农指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在二叉树中找到两个节点的最近公共祖先(NC102/考察次数Top25/难度中等)相关的知识,希望对你有一定的参考价值。

描述:
给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
注:本题保证二叉树中每个节点的val值均不相同。

示例1
输入:
[3,5,1,6,2,0,8,#,#,7,4],5,1
返回值:
3
(题目来自牛客网)

用C++实现如下

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        //思路1,使用递归函数来完成,最近公共祖先和o1,o2有三种关系
        //1.o1,o2分别在祖先左右两侧;2.祖先是o1,o2在左右两侧;3.祖先是o2,o1在左右两侧;
        //将CommmonAncestor定义成了求祖先节点的函数,使用递归函数进行求解
        return CommonAncestor(root, o1, o2)->val;                      //输入root节点,以及o1,o2的值
               
    }

    TreeNode* CommonAncestor(TreeNode *root, int o1, int o2)           //输入root节点,以及o1,o2的值
    {
        if (root == nullptr || root->val == o1 || root->val == o2)     //根节点为空,或者情况二和三
        {
            return root;
        }
        TreeNode *left = CommonAncestor(root->left,o1,o2);             // 在左侧进行求解,得出节点结果
        TreeNode *right = CommonAncestor(root->right,o1,o2);           // 在右侧进行求解,得出节点结果
        if (left == nullptr) {                 // 左侧无解
            return right;
        }
        if (right == nullptr) {                // 右侧无解
            return left;
        }
        return root;                           // 说明刚好在root的左右两侧
    } 
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

以上是关于在二叉树中找到两个节点的最近公共祖先(NC102/考察次数Top25/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章

在二叉树中找到两个节点最近公共祖先

#yyds干货盘点# 面试必刷TOP101:在二叉树中找到两个节点的最近公共祖先

leetcode刷题13

如果不是树中的所有这些节点,Python会在二叉树中找到两个节点的最低共同祖先

236. 二叉树的最近公共祖先[中等]

2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 pq,最近公共祖先表示为一个节点 x,满足 x 是 p