编程题——最近公共祖先
题目描述:
有一棵无穷大的满二叉树,其结点按根结点一层一层地从左往右依次编号,根结点编号为1。现在有两个结点a,b。请设计一个算法,求出a和b点的最近公共祖先的编号。
给定两个int a,b。为给定结点的编号。请返回a和b的最近公共祖先的编号。注意这里结点本身也可认为是其祖先。
程序代码如下:
#include <iostream>
using namespace std;
/*leftchild=2*parent-1;
*循环比较a和b,取较大的值/2得到其父亲结点,
*直到a=b即找到公共祖先*/
class LCA {
public:
int getLCA(int a, int b) {
while (a != b)
{
if (a > b)
a /= 2;
else
b /= 2;
}
return a;
}
};
int main()
{
LCA l;
int a, b;
while (cin >> a >> b)
cout << l.getLCA(a, b) << endl;
return 0;
}
程序运行结果如下: