Algorithm 给定一棵二叉树和一个LCA,找出具有此LCA的节点对的数目?

Algorithm 给定一棵二叉树和一个LCA,找出具有此LCA的节点对的数目?,algorithm,binary-search-tree,Algorithm,Binary Search Tree,考虑定义如下的无限二叉树 对于标记为v的节点,让其左子节点表示为2*v,右子节点表示为2*v+1。树的根标记为1 对于给定的n个范围[a_1,b_1],[a_2,b_2]。。。[a_n,b_n]对于其中(a_i好的,使用这种递归方法计算符号中两个节点的LCA是相当简单的: intlca(inta,intb){ 如果(a==b)返回a; 如果(a

考虑定义如下的无限二叉树

对于标记为v的节点,让其左子节点表示为2*v,右子节点表示为2*v+1。树的根标记为1


对于给定的n个范围[a_1,b_1],[a_2,b_2]。。。[a_n,b_n]对于其中(a_i好的,使用这种递归方法计算符号中两个节点的LCA是相当简单的:

intlca(inta,intb){
如果(a==b)返回a;
如果(a
现在要找到集合的并集,我们首先需要能够找到特定范围代表的集合。让我们介绍一种工厂方法:

设置范围集(int a、int b){
设置结果=新哈希集(b-a);
对于(int n=a;ny&&lca(x,y)==t)结果++;
返回结果;
}
其他一切都只是粘合逻辑,即从您的输入需求转换为此处获取的需求的方法。例如:

设置UnionSetFromBoundsList(int[]a,int[]b){
集合[]范围=新集合[a.长度];
对于(int idx=0;idx
二叉树是它的根节点
类节点{node parent,first,second;}
。您使用了一些奇怪的表示法,似乎是指存储节点元素的数组索引,但树通常不是以这种方式存储在数组中的。您能提供一个链接来准确描述“LCA”的含义吗,或描述“树”的符号?数字不是树节点。我会尽我所能,耐心地解决这个有趣的问题。看到这里有人问这个问题,我真的很难过。这是我为一个在线测试设置的问题。测试刚刚结束,所以这是在测试期间问到的。我想添加这个作为评论,但没有足够的声誉来回答这样做,然后把它作为一个答案。谢谢!它帮助了我。很抱歉,我不能升级它,因为我没有15个声誉。@MariaJones,但请注意,这段代码远不是最佳的。我用了最简单、最快和最脏的方式。这段代码在大多数实际应用中可能会慢得令人无法接受。如果性能更好的话如果需要mance,请修改
lca
以缓存已计算的值(或使其计算更直接),并使用更精简(更稀疏)的数据结构而不是集合。您帮助了我,这很重要!:D@MariaJones我还猜想你的教授可能期望得到一个比这里的O(n^2)快得多的解。
A = {2, 12, 11}
B = {3, 13, 12}
T = 1
A = {1,7}
B = {2,15}
T = 3