分治:即把一个复杂的问题分成两个或多个子问题,子问题之间相互独立且与原问题相同或相似,持续分解,直到最后的子问题可以简单的求解。原问题即子问题解的合并。

由于反复利用分治手段,这就为使用递归策略提供了条件。

解法:采用递归策略,根据二叉树的性质:左子树编号为2m,右子树为2m+1,不断的去计算节点数。

#include <iostream>

using namespace std;

int BinaryTree(int m, int n) {
    if(m <= n) {
        return 1 + BinaryTree(m * 2, n) + BinaryTree(m * 2 + 1, n);
    } else {
        return 0; // m > n, end.
    }
}

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