二叉树结点公共祖先 <O(logn)求解>

来源:互联网 发布:穷养儿富养女知乎 编辑:程序博客网 时间:2024/06/05 23:56


一个顺序存储的完全二叉树:

             1

          /     \

        2         3

      /   \     /    \

    4       5  6      7

    ...

任意给定两结点的编号,求两结点最近的公共祖先。

Input

每组数据一行,为空格隔开的两个数i和j,皆为32位有符号正整数

Output

每组数据对应一行,为编号为i和j的结点的最近公共祖先的编号

Sample Input
4 54 7
Sample Output
21
Hint

完全二叉树,思路很简单,我们先让大的数向小的数靠拢,一直减小到两个数在树的同一层

然后两个数一起往上找祖先,找到相同的就退出循环,因为任意两个数的最远的祖先一定是1,所以不用担心找不到死循环的可能


#include <iostream>#include <cstring>#include <stack>#include <cstdio>#include <cmath>#include <queue>#include <algorithm>#include <vector>#include <set>#include <map>const double eps=1e-8;const double PI=acos(-1.0);using namespace std;int main(){    int n,m;    while(~scanf("%d %d",&n,&m)){            if(n>m)            swap(n,m);        while((int)log2(m)!=(int)log2(n)){//一直缩减到同一层            m/=2;        }        while(m!=n){//同时向上找祖先            m/=2;            n/=2;        }        printf("%d\n",n);    }    return 0;}



原创粉丝点击