北京大学复试上机题(二叉树)
可采用分治的方法,先统计m点的节点数,然后递归地统计m左子树和右子树的节点数,当节点编号大于n时,递归返回。

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

int sum = 0;        // 欲输出的节点总数

void nodeNum(int n, int m) {
    if (m > n) return;
    ++sum;          // 统计本节点
    nodeNum(n, 2*m);        // 统计左子树节点和右子树节点数
    nodeNum(n, 2*m + 1);
}

int main() {
    int n, m;
    while (scanf("%d %d", &m, &n) != EOF) {
        nodeNum(n, m);
        printf("%d\n", sum);
    }
    return 0;
}