二叉树最近公共祖先节点
寻找最近公共祖先节点(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
二叉树最近公共祖先节点相关推荐
- 顺序存储二叉树之寻找公共祖先节点
题目:已知一课二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个节点的最近的公共祖先节点的值 分析: 利用数组存储一颗二叉树,一般来说我们用这种方式存储一颗完 ...
- 二叉树寻找祖先C语言,二叉树寻找最近公共祖先节点
方法一:递归 1.思路 (1)定义fx表示x节点的子树中是否包含p或者q节点,如果包含为true,否则为false.那么符合条件的最近公共祖先节点一定满足下面的条件: (flson && ...
- 二叉树的公共祖先问题
二刷随想录的时候发现,二叉树的公共祖先问题有一个点很巧妙,在这里记录下来,也作为之后复习用的笔记. 记录内容就以随想录的两道题为主. 1.二叉树的最近公共祖先 对应题目236. 二叉树的最近公共祖先 ...
- 经典算法——二叉搜索树的公共祖先节点
介绍 二叉搜索树的公共祖先节点是指:对于给定的两个节点p.q,向上寻找离二者最近的公共节点. public class Node<T extends Comparable<T>> ...
- 求节点p和q的最近公共祖先节点
//求节点p和q的最近公共祖先节点,假设用后序遍历先遇到p节点 typedef struct{BiTree t;int tag; //tag=0表示左子女已被访问,tag=1表示右子女已被访问. }s ...
- 求二叉树中任意两个节点的最近公共祖先节点
思路:从根节点开始遍历,如果node1和node2中的任一个和root匹配,那么root就是最低公共祖先. 如果都不匹配,则分别递归左.右子树,如果有一个 节点出现在左子树,并且另一个节点出现在右子树 ...
- 二叉树最近公共祖先相关题目(Leetcode题解-Python语言)
236. 二叉树的最近公共祖先 class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'T ...
- [Leedcode][JAVA][第236题][二叉树的公共祖先][后序遍历][BFS]
[问题描述] 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先.百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p. ...
- 二叉树最近公共祖先 LCA
题目: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 ...
最新文章
- 变量作用域与预处理命令习题
- 怎么用c语言做出等妖三角形_初二数学培优,怎么用顶点坐标求三角形面积?割补法这样用很简单...
- sml完整形式_411的完整形式是什么?
- Makefile规则介绍
- linux cd 命令案例,15个关于Linux的‘cd’命令的练习例子
- 认识Linux系统中的inode,硬链接和软链接
- 运行stam 遇到的问题:
- 清华成北京赛赢家,旷视唐文斌分享本质创业 | 联想高校AI精英挑战赛
- 竖流式沉淀池三角堰计算_18张直观动图带你了解在洗砂、选矿中,沉淀池及与其相关设备...
- numpy 基础 —— np.linalg
- 浅谈Android测试技术
- 常见浏览器兼容性问题及解决办法总结
- 微信图片服务器逻辑,关于图片上传原图会被压缩的解决方案
- python制作u盘病毒_Python-记一次U盘中病毒及文件找回
- 浅析2D横版过关游戏关卡制作要点
- Nginx+Tomcat 负载均衡+动静分离
- 山东微信红包派发量全国第8
- 涂涂乐制作之不得不说的坑
- C语言之逻辑移位与算术移位
- [OpenGL]导入obj文件
热门文章
- 华为云免费体验 怎么使用_华为云Classroom免费向全国高校开放,云端学习更高效...
- 两个主键怎么设置tsql_如何在sql server中设置两个主键?
- 将coreldraw文档以html,国家信息化(CEAC)考试试题集Coreldraw.doc
- 其他系统 对外接口设计_设计模式分类及设计原则
- AWS 开源 SageMaker,帮助开发人员优化机器学习模型
- [HDU 1254] 推箱子
- 大龄码农经验那么丰富,为什么很多公司都不招?
- Micropython实例之TPYBoardv102开发板DIY照相机
- 物联网将推动半导体产业继续增长
- 第六十一节,html超链接和路径