二叉树(二叉树上LCA)
题意
给定一个从\(1\)开始编号的二叉树,给定两个点\(x\)和\(y\),求他们的最近公共祖先。
题目链接:https://www.acwing.com/problem/content/3435/
数据范围
\(1 \leq x, y \leq 2^31 - 1\)
思路
首先可以观察出一个性质,就是节点的编号除以\(2\),就得到其父亲的编号。
因此,如果\(x\)的编号比\(y\)大,那么\(x / 2\);反之,\(y / 2\)。循环进行,直到二者编号相等为止。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int x, y;
int main()
{
cin >> x >> y;
while(x != y) {
if(x > y) x /= 2;
else y /= 2;
}
cout << x << endl;
return 0;
}