寻找最近公共祖先节点(LCA)

在一棵二叉树中,对于节点X和节点Y,X和Y的LCA是这棵树中X和Y的第一个共同祖先。寻找公共节点的算法思路很简单:对于节点x和y,找到树的根节点分别到x节点和y节点的路径(并不是遍历),并分别记录在两个数组中(或其他),数组中索引为0的元素为树的根节点,索引越小的元素离待x和y节点越远。且两个数组前面肯定有对应相同的元素。此时问题变为正向查找两个数组中第一个不相同元素的前一个(相同),即最后一个相同的元素。

1.如果这棵二叉树是二叉查找树,那么记录根节点到x和y节点的路径问题变得很简单,借助于二叉查找树的性质,借助BST的查找过程,很简单便可以做到。例:leetcode_235 LowestCommon Ancestor of a Binary Search Tree:Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.

代码:

/*** 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:
void find1(TreeNode* root,TreeNode* p,vector<TreeNode*> &v)
{if(root == p){v.push_back(root); return ;}if(p->val > root->val){v.push_back(root);find1(root->right,p,v); } else{v.push_back(root);find1(root->left,p,v); }
}
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == NULL || p == NULL || q == NULL)return NULL;vector<TreeNode*> v1;vector<TreeNode*> v2;find1(root,p,v1);     find1(root,q,v2);int i,j;//cout<<v1.size()<<endl;//cout<<v2.size()<<endl;for(i = 0,j = 0;i<v1.size()-1,j<v2.size()-1;i++,j++){if(v1[i] == v2[j] && v1[i+1] != v2[j+1]) break;}return v1[i];}
};

2.若一棵树是普通的二叉树,则二叉排序树在查找方面的特性不能应用。在普通二叉树中,寻找从根节点到任意节点的路径不像是在BST中那么简单,我们先要解决这个问题。例:leetcode-236 Lowest Common Ancestor of a Binary Tree

bool findP(TreeNode *root,TreeNode *p,vector<TreeNode*> &v)//递归查找,路径记录在v中
{if(p==NULL || root == NULL)return false;v.push_back(root);if(root == p)return true;if(root->left != NULL && findP(root->left,p,v) == true ){return true;}if(root->right != NULL && findP(root->right,p,v) == true){return true;}v.pop_back();//在该子树上查找失败,则删除这个根节点return false;
}

接下来的思路和上述一样,正向查找两个数组中第一个不相同元素的前一个(相同),即最后一个相同的元素。

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
{if(root == NULL || p == NULL || q == NULL){return NULL;}vector<TreeNode *> v1;findP(root,p,v1);vector<TreeNode*> v2;findP(root,q,v2);int len = v1.size()<v2.size()?v1.size():v2.size();int i = 0;for(i = 0;i<len-1;i++){if(v1[i] == v2[i] && v1[i+1]!=v2[i+1])break;}return v1[i];
}

转载于:https://www.cnblogs.com/sunp823/p/5601418.html

二叉树最近公共祖先节点相关推荐

  1. 顺序存储二叉树之寻找公共祖先节点

    题目:已知一课二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个节点的最近的公共祖先节点的值     分析:         利用数组存储一颗二叉树,一般来说我们用这种方式存储一颗完 ...

  2. 二叉树寻找祖先C语言,二叉树寻找最近公共祖先节点

    方法一:递归 1.思路 (1)定义fx表示x节点的子树中是否包含p或者q节点,如果包含为true,否则为false.那么符合条件的最近公共祖先节点一定满足下面的条件: (flson && ...

  3. 二叉树的公共祖先问题

    二刷随想录的时候发现,二叉树的公共祖先问题有一个点很巧妙,在这里记录下来,也作为之后复习用的笔记. 记录内容就以随想录的两道题为主. 1.二叉树的最近公共祖先 对应题目236. 二叉树的最近公共祖先 ...

  4. 经典算法——二叉搜索树的公共祖先节点

    介绍 二叉搜索树的公共祖先节点是指:对于给定的两个节点p.q,向上寻找离二者最近的公共节点. public class Node<T extends Comparable<T>> ...

  5. 求节点p和q的最近公共祖先节点

    //求节点p和q的最近公共祖先节点,假设用后序遍历先遇到p节点 typedef struct{BiTree t;int tag; //tag=0表示左子女已被访问,tag=1表示右子女已被访问. }s ...

  6. 求二叉树中任意两个节点的最近公共祖先节点

    思路:从根节点开始遍历,如果node1和node2中的任一个和root匹配,那么root就是最低公共祖先. 如果都不匹配,则分别递归左.右子树,如果有一个 节点出现在左子树,并且另一个节点出现在右子树 ...

  7. 二叉树最近公共祖先相关题目(Leetcode题解-Python语言)

    236. 二叉树的最近公共祖先 class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'T ...

  8. [Leedcode][JAVA][第236题][二叉树的公共祖先][后序遍历][BFS]

    [问题描述] 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先.百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p. ...

  9. 二叉树最近公共祖先 LCA

    题目: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 ...

最新文章

  1. 变量作用域与预处理命令习题
  2. 怎么用c语言做出等妖三角形_初二数学培优,怎么用顶点坐标求三角形面积?割补法这样用很简单...
  3. sml完整形式_411的完整形式是什么?
  4. Makefile规则介绍
  5. linux cd 命令案例,15个关于Linux的‘cd’命令的练习例子
  6. 认识Linux系统中的inode,硬链接和软链接
  7. 运行stam 遇到的问题:
  8. 清华成北京赛赢家,旷视唐文斌分享本质创业 | 联想高校AI精英挑战赛
  9. 竖流式沉淀池三角堰计算_18张直观动图带你了解在洗砂、选矿中,沉淀池及与其相关设备...
  10. numpy 基础 —— np.linalg
  11. 浅谈Android测试技术
  12. 常见浏览器兼容性问题及解决办法总结
  13. 微信图片服务器逻辑,关于图片上传原图会被压缩的解决方案
  14. python制作u盘病毒_Python-记一次U盘中病毒及文件找回
  15. 浅析2D横版过关游戏关卡制作要点
  16. Nginx+Tomcat 负载均衡+动静分离
  17. 山东微信红包派发量全国第8
  18. 涂涂乐制作之不得不说的坑
  19. C语言之逻辑移位与算术移位
  20. [OpenGL]导入obj文件

热门文章

  1. 华为云免费体验 怎么使用_华为云Classroom免费向全国高校开放,云端学习更高效...
  2. 两个主键怎么设置tsql_如何在sql server中设置两个主键?
  3. 将coreldraw文档以html,国家信息化(CEAC)考试试题集Coreldraw.doc
  4. 其他系统 对外接口设计_设计模式分类及设计原则
  5. AWS 开源 SageMaker,帮助开发人员优化机器学习模型
  6. [HDU 1254] 推箱子
  7. 大龄码农经验那么丰富,为什么很多公司都不招?
  8. Micropython实例之TPYBoardv102开发板DIY照相机
  9. 物联网将推动半导体产业继续增长
  10. 第六十一节,html超链接和路径