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

二叉树 给定n,求子树包含的节点(递归)

程序员文章站 2024-03-12 15:07:14
...

二叉树 给定n,求子树包含的节点(递归)

    如上所示,由正整数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)。

输出描述:

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

示例1

输入

3 12
0 0

输出

4

 

求解:

求m的字数 == 自己 + 左子树(小弟)的个数 + 右子树(小弟)的个数

第一层:2^0个

第二次:2^1个

第三次:2^2个

第n层:2^(n - 1 )个

#include <iostream>
#include <cmath>
using namespace std;

int n; // 结尾
int m; // 我的m

int level = 0; // n处在第几层
int a,b; //最后一层左右

int getRes(int m) {
	if (m > n) {
		return 0;
	} else if (m >= a && a <= b) {
		return 1;
	} else {
		return (1 + getRes(2 * m) + getRes(2 * m + 1));
	}
}

void setLevel() {
	int contain;

	a = 0;
	b = 0;
	for (int i = 1; ; i++) {
		contain = pow(2,i-1);
		a = b;
		b = a + contain;
		if (n >= a && n <= b) {
			level = i;
			break;
		}
	}

}

int main() {
	while(cin >> m >> n && m != 0 && n != 0) {
		setLevel();
		int res = getRes(m);
		cout << res << endl;
	}

}

 

相关标签: 机试