【二叉树】统计节点个数

描述

如上图所示,由正整数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)。最后一组测试数据中包括两个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;
}

 

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注

5 × 2 =