1. 程式人生 > >資料結構 結點所在子樹的結點數

資料結構 結點所在子樹的結點數

題目描述:

    如上所示,由正整數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)。

輸出描述:

對於每一組測試資料,輸出一行,該行包含一個整數,給出結點m所在子樹中包括的結點的數目。

輸入樣例:

3 12

輸出樣例:

4

解題思路: 

遞迴求解,遞迴部分實際求的是二叉樹的虛擬葉結點數,所謂虛擬葉結點是指把一棵樹補成完全二叉樹而新新增的虛擬葉結點。虛擬葉結點數=樹結點數+1 。

AC程式碼:

#include <bits/stdc++.h>
using namespace std;

int countNode(int n,int m)
{
    if(m > n)    //說明已經到了葉結點下面的空結點了
    {
        return 0;
    }
    //子結點分別是父結點的二倍和二倍+1,相加之後可以得到樹節點數
    //虛擬葉結點數=樹結點數+1
    return countNode(n,2*m) + countNode(n,2*m+1) + 1;
}

int main()
{
    int n,m;
    while(cin >> m >> n && m!=0 && n!=0)
    {
        cout << countNode(n,m) << endl;
    }
    return 0;
}