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
p
和q
均存在于给定的二叉树中。
方法一:深搜确定路径,然后匹配
定义一个函数进行深搜,如果搜索到待寻找元素就返回当前节点到寻找节点的路径,否则就返回“空”
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. 二叉树的最近公共祖先的主要内容,如果未能解决你的问题,请参考以下文章