求二叉树的任意两个节点的最近公共祖先
来源:互联网 发布:阿里云的cdn怎么样 编辑:程序博客网 时间:2024/04/30 10:14
转自:http://eriol.iteye.com/blog/1170465
二叉查找树
如果该二叉树是二叉查找树,那么求解LCA十分简单。
基本思想为:从树根开始,该节点的值为t,如果t大于t1和t2,说明t1和t2都位于t的左侧,所以它们的共同祖先必定在t的左子树中,从t.left开始搜索;如果t小于t1和t2,说明t1和t2都位于t的右侧,那么从t.right开始搜索;如果t1<t< t2,说明t1和t2位于t的两侧,那么该节点t为公共祖先。
如果t1是t2的祖先,那么应该返回t1的父节点;同理,如果t2是t1的祖先,应该返回t2的父节点。
public int query(Node t1, Node t2, Node t) {int left = t1.value;int right = t2.value;Node parent = null;if (left > right) {int temp = left;left = right;right = temp;}while (true) {if (t.value < left) {parent = t;t = t.right;} else if (t.value > right) {parent = t;t = t.left;} else if (t.value == left || t.value == right) {return parent.value;} else {return t.value;}}}
一般的二叉树
如果二叉树不是二叉查找树该怎么办呢?
1. 离线算法(Tarjan)
利用并查集优越的时空复杂度,可以实现O(n+q)的算法,q是查询次数。
Tarjan算法基于深度优先搜索。对于新搜索到的一个结点u,先创建由u构成的集合,再对u的每颗子树进行搜索,每搜索完一棵子树,这时候子树中所有的结点的最近公共祖先就是u了。
void LCA(int parent) //从根节点开始{p[parent] = parent;ancestor[findSet(parent)] = parent;for(int i = index[parent]; i != -1; i = e[i].next){LCA(e[i].to);Union(parent,e[i].to);ancestor[findSet(parent)] = parent;}vis[parent] = true;if(parent == a && vis[b])//要先将所有查询记录下来,这里只有一个查询:a与b的LCAprintf("%d\n",ancestor[findSet(b)]);else if(parent == b && vis[a])printf("%d\n",ancestor[findSet(a)]);}
0 0
- 求二叉树的任意两个节点的最近公共祖先
- LCA问题:求二叉树中任意两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- 求二叉树中两个节点的最近公共祖先
- 在二叉树中,求任意两个节点的最近公共祖先(遍历的应用算法)
- ~求两个节点的最近公共祖先~
- 求两个节点最近的公共祖先
- 二叉树中两个节点的最近公共祖先节点
- 二叉树中两个节点的最近公共祖先节点
- 二叉树中两个节点的最近公共祖先节点
- 二叉树中两个节点的最近公共祖先节点
- 求二叉树中两个节点的最近公共祖先节点
- 求二叉树中两个节点的最近公共祖先节点
- 二叉树两个节点求最近的公共祖先节点java代码实现
- 二叉树--求二叉树中两个节点的最近公共祖先
- JavaScript小特性(6)——函数式编程
- 文字的颗粒效果
- Newtonsoft.Json.4.5.11使用方法总结---反序列化json字符串
- 从简单实例开始,学会写Makefile(二)
- java的selector用法
- 求二叉树的任意两个节点的最近公共祖先
- 【LeetCode】-Remove Duplicates from Sorted List
- HahaMil数据库(数据库操作组件)
- Longest Common Prefix
- 查找优化
- Android中文API(122) —— AudioRecord
- hdu 4569 TSP
- linux进程间通信-信号通信
- AudioRecord