Codeup《算法笔记》9.2小节——数据结构专题(2)->二叉树的遍历->二叉树

Problem B: 二叉树
[Creator : Imported]
Time Limit : 1.000 sec Memory Limit : 32 MB

Description

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

比如,n = 12,m = 3那么上图中的结点13,14,15以及后面的结点都是不存在的,结点m所在子树中包括的结点有3,6,7,12,因此结点m的所在子树中共有4个结点。

Input

输入数据包括多行,每行给出一组测试数据,包括两个整数m,n (1 <= m <= n <= 1000000000)。最后一组测试数据中包括两个0,表示输入的结束,这组数据不用处理。

Output

对于每一组测试数据,输出一行,该行包含一个整数,给出结点m所在子树中包括的结点的数目。

Sample Input Copy

3 7
142 6574
2 754
0 0

Sample Output Copy

3
63
498

思路分析:

题目的意思是说给两个数字,一个代表二叉树的结点总数,一个是指定的结点位置,求指定结点的所有孩子结点个数
直接循环找到二叉树的深度和指定节点所在深度,每次叠加2的递增次方,直到次方为相差的深度,最后根据给定节点的最底层左边的结点来判断最后一层是加还是不加,加的话加多少。

#include 
#include 
#include 
using namespace std;
int index[31];
int main()
{
     
	int m,n;
	for(int i=0;i<31;i++){
     
		index[i]=pow(2,i);
	}
	while(scanf("%d%d",&m,&n)!=EOF){
     
		if(m==0 && n==0)  break;  
		int i,j; 
		int sum=0;
		for(i=1;;i++){
      
			if(n<=pow(2,i)-1) break;
		}
		for(j=1;;j++){
     
			if(m<=pow(2,j)-1) break;
		}//i>=j;
		int k;
		for( k=0;k<i-j;k++){
     
			sum+=index[k];
			m*=2;
		}
		if(n>=m){
     
			if(n-m+1<index[k]) {
     
				sum+=n-m+1;
			}
			else{
     
				sum+=index[k];
			}
		}
		cout<<sum<<endl;
	}
	return 0;
}
/**************************************************************
    Problem: 1905
    User: Jccober
    Language: C++
    Result: Accepted
    Time:1 ms
    Memory:1896 kb
****************************************************************/

你可能感兴趣的