对于一个无穷的满二叉排序树(如图),节点的编号是1,2,3,…。对于一棵树根为X的子树,沿着左节点一直往下到最后一层,可以获得该子树编号最小的节点;沿着右节点一直往下到最后一层,可以获得该子树编号最大的节点。现在给出的问题是“在一棵树根为X的子树中,节点的最小编号和最大编号是什么?”。请你给出答案。
输入格式:
输入的第一行给出测试用例的数目,一个整数N。在后面的N行中,每行给出一个整数X(1<=X<=231-1),表示子树树根的编号。
输出格式:
输出N行,第i行给出第i个问题的答案。
输入样例:
2
8
10
输出样例:
1 15
9 11
代码长度限制
16 KB
时间限制
1000 ms
内存限制
64 MB
#include <iostream>
#include <vector>
#include <map>
#include <set>
using namespace std;
int main()
{
int n;
int root;
cin>>n;
while (n--)
{
int k=1;
cin>>root;
int l,r;
l=root;
r=root;
int temp=1;
while (root%2==0)
{
root/=2;
l-=temp;
r+=temp;
temp*=2;
}
cout<<l<<" "<<r<<endl;
}
return 0;
}