欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如上图所示,由正整数1,2,3……组成了一颗二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。

程序员文章站 2024-01-15 15:34:46
...

一个具有n个结点的二叉树,二叉树顺序放置数字1~n,问结点m所在子树包含结点数目。如图。

如上图所示,由正整数1,2,3……组成了一颗二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。


#include <iostream>
using namespace std;
int main()
{
    int m,n;
   while(cin>>m>>n&&(m!=0||n!=0)){//设置循环输入以2个0结束
    int t=1,s=0,sum=1;
    int i=m;
    while(i<n){
        i=2*i+1;
        s++;//s用于统计行数
        }
     for(int j=s-1;j>0;j--){//最后一行不一定全都有所以s-1
         t=t*2;//t用于记录每一行的个数
         sum=sum+t;//sum记录除最后一行其余行的总个数
         }
         t=t*2;//这里t再将最以后一行算上
    if(n-m*t>=0)sum=sum+n-(m*t)+1;//这里sum再将最后一行算上(if判断因为可能没到最后一行结点就到最后一个了)
    cout<<sum<<endl;}
}