LeetCode 0236. 二叉树的最近公共祖先

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0236. 二叉树的最近公共祖先相关的知识,希望对你有一定的参考价值。

【LetMeFly】236.二叉树的最近公共祖先

力扣题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/

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

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

方法一:深搜确定路径,然后匹配

定义一个函数进行深搜,如果搜索到待寻找元素就返回当前节点到寻找节点的路径,否则就返回“空”

vector<TreeNode*> dfs(TreeNode* root, TreeNode* finding) 
	如果当前节点为空,就返回空数组
	如果当前节点就是待搜索元素,就返回当前元素

	对左子树进行搜索,如果左子树中找到了代寻找节点(不空),就返回“左子到待寻找元素的路径 + 这个点”
	右子树同理

	左右子树都找不到,就返回空数组

这样,我们就可以确定根节点到第一个待寻找节点的路径,也可以确定根节点到第二个待寻找节点的路径。

将第一个路径用哈希表存起来,第二个路径从待寻找元素往根节点遍历,第一个存在于哈希表中的元素就是两个节点的最近公共祖先。

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n是二叉树节点的个数
  • 空间复杂度 O ( n ) O(n) O(n)

AC代码

C++

class Solution 
private:
    /*
        如果找到finding,就返回当前到finding的路径
        否则就返回空数组
    */
    vector<TreeNode*> dfs(TreeNode* root, TreeNode* finding) 
        if (!root)
            return ;
        if (root == finding)
            return finding;
        vector<TreeNode*> left = dfs(root->left, finding);
        if (left.size()) 
            left.push_back(root);
            return left;
        
        vector<TreeNode*> right = dfs(root->right, finding);
        if (right.size()) 
            right.push_back(root);
            return right;
        
        return ;
    
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) 
        vector<TreeNode*> pathP = dfs(root, p);
        vector<TreeNode*> pathQ = dfs(root, q);
        unordered_set<TreeNode*> se;
        for (auto& thisNode : pathP) 
            se.insert(thisNode);
        
        for (auto& thisNode : pathQ) 
            if (se.count(thisNode)) 
                return thisNode;
            
        
        return nullptr;  // FakeReturn
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126782886

以上是关于LeetCode 0236. 二叉树的最近公共祖先的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 236. 二叉树的最近公共祖先

leetcode 236 二叉树的最近公共祖先

LeetCode二叉树的最近公共祖先

Leetcode 236.二叉树的最近公共祖先

leetcode-236二叉树的最近公共祖先

leetcode 236. 二叉树的最近公共祖先