【算法練習】數據結構/完全二叉樹 子樹結點個數 百練poj2788:二叉樹

題目鏈接: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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章