LeetCode 面试经典150题 [73/150 二叉树的最近公共祖先]


avatar
GuoYulong 2024-07-31 203

题目描述

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

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 1:

复制代码
  1. 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
  2. 输出:3
  3. 解释:节点 5 和节点 1 的最近公共祖先是节点 3

示例 2:

复制代码
  1. 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
  2. 输出:5
  3. 解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

个人C++解答


官方题解二:存储父节点;利用哈希表存储所有节点的父节点,然后利用节点的父节点信息从p节点不断往上跳,并记录已经访问过的节点,再从q节点不断往上跳,如果碰到已经访问过的节点,那么这个节点就是我们要找的最近公共祖先
dfs用作遍历整棵二叉树,将父节点信息存储在fa表中,创建vis表,在fa表中向上查询p的父节点,查询到即在vis表中置true,在fa表中查询q的父节点,付过查到q的父节点在vis表中,则返回这个父节点;

GYL
复制代码
  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. unordered_map<int, TreeNode*> fa;
  13. unordered_map<int, bool> vis;
  14. void dfs(TreeNode* root) {
  15. if (root->left != nullptr) {
  16. fa[root->left->val] = root;
  17. dfs(root->left);
  18. }
  19. if (root->right != nullptr) {
  20. fa[root->right->val] = root;
  21. dfs(root->right);
  22. }
  23. }
  24. TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
  25. fa[root->val] = nullptr;
  26. dfs(root);
  27. while(p!=nullptr){
  28. vis[p->val] = true;
  29. p = fa[p->val];
  30. }
  31. while(q!=nullptr){
  32. if(vis[q->val]) return q;
  33. q = fa[q->val];
  34. }
  35. return nullptr;
  36.  
  37. }
  38. };

相关阅读

注意!!!

站点域名更新!!!部分文章图片等由于域名问题无法显示!!!

通知!!!

站点域名更新!!!部分文章图片等由于域名问题无法显示!!!