满二叉树中求两点的公共祖先节点
题目:有一颗无穷大的满二叉树,其结点按照根节点一层一层地往右依次编号,根结点编号为1。现有两个节点a,b。设计一个算法求a和b点地最近公共祖先地编号。
一、二叉树需要知道的知识
根节点=孩子节点/2
n层的最小节点和最大节点编号为(画图自己找一下规律):
min=2^n
max=min*2-1;
二、解题
1.思路
(1)确定节点a和b是在二叉树的哪一层,用reta和retb表示
(2)将层数高的节点求根节点,直至节点a和b在同一层
(3)判断是否是同一根节点
2.解题代码
代码如下:
class LCA {
public:
int getLCA(int a, int b) {
// 保证a是最小数
if (a>b)
{
swap(a, b);
}
int min = 0;
int max = 0;
int reta = 0;
int retb = 0;
// 确定a,b在二叉树的第几层
while (1)
{
min = pow(2, reta);
max = min * 2;
if (a >= min && a<max)
{
break;
}
reta++;
}
retb = reta;
while (1)
{
min = pow(2, retb);
max = min * 2;
if (b >= min && b<max)
{
break;
}
retb++;
}
// 将a和b放在二叉树的同一层
while (reta<retb)
{
b /= 2;
retb--;
}
// 判断是否是同一根节点
while (a / 2 != b / 2)
{
a /= 2;
b /= 2;
}
return a / 2;
}
};