題目鏈接:http://bailian.openjudge.cn/practice/2788
2788:二叉樹
總時間限制:
3000ms
內存限制:
65536kB
描述
如上圖所示,由正整數1,2,3……組成了一顆二叉樹。我們已知這個二叉樹的最後一個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。
比如,n = 12,m = 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹中共有4個結點。
輸入
輸入數據包括多行,每行給出一組測試數據,包括兩個整數m,n (1 <= m <= n <= 1000000000)。最後一組測試數據中包括兩個0,表示輸入的結束,這組數據不用處理。
輸出
對於每一組測試數據,輸出一行,該行包含一個整數,給出結點m所在子樹中包括的結點的數目。
樣例輸入
3 12 0 0
樣例輸出
4
題目理解:
完全二叉樹
每個結點
左孩子 2*i 右孩子 2*i+1
設置left right 按照完全二叉樹每一行去遍歷算就行,算最左結點、最右結點
AC代碼:
#include<iostream>
using namespace std;
int n,m;
int main(){
while(cin>>m>>n){
if(n==0 && m==0) break;
int ans=1;
int num=1; //完全二叉樹第一層的結點個數
int left=2*m;
int right=2*m+1;
while(right<=n){
num=num*2;
ans+=num;
left=left*2;
right=right*2+1;
}
if(left<=n)
ans+=n-left+1;
cout<<ans<<endl;
}
return 0;
}