Codeup《演算法筆記》9.2小節——資料結構專題(2)->二叉樹的遍歷->二叉樹

Jccober發表於2020-10-11

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 <iostream>
#include <algorithm>
#include <math.h>
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
****************************************************************/

相關文章