二叉树 给定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;
	}

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值