POJ 2309 BST 【位运算】

题意: 给你一个二叉树,如图:

给你一个节点,输出以这个节点为根的最小值和最大值。

分析: 经观察可以发现,叶子节点是连续的的奇数,所以只要找到所给节点的数的区间上最小奇数和最大奇数即可。

View Code
#include<stdio.h>
int main()
{
    int t,n,min,max,lowbit;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        lowbit=(n)&(-n);  // 取最后一个 1
        min=n-(lowbit-1); // 取得个该区间上的最小奇数。
        max=n|(n-1);      // 把最后面连续的0 变成 1
        printf("%d %d\n",min,max);
    }
    return 0;
}
posted @ 2012-04-30 16:31  'wind  阅读(276)  评论(0编辑  收藏  举报