分治:即把一个复杂的问题分成两个或多个子问题,子问题之间相互独立且与原问题相同或相似,持续分解,直到最后的子问题可以简单的求解。原问题即子问题解的合并。
由于反复利用分治手段,这就为使用递归策略提供了条件。
解法:采用递归策略,根据二叉树的性质:左子树编号为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; }