描述

比如,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
分析
利用顺序二叉树的性质,开始节点为m,左儿子是left:2*m,右儿子是right:2*m+1。每层迭代获得right – left + 1个节点,当2*m+1>n时结束,此时不满。改用,n-2*left+1计算
代码:
#include<iostream> using namespace std; int main() { int n, m; while (cin >> m >> n && m != 0) { int num = 1; if (m == n) //特判 { num = 1; } else { int left = 2 * m; int right = 2 * m + 1; while (right < n) { num += (right - left + 1); left = 2 * left; right = 2 * right + 1; } if (n >= left) { num += n - left + 1; } } cout << num << endl; } return 0; }