二叉树 给定n,求子树包含的节点(递归)
程序员文章站
2024-03-12 15:07:14
...
如上所示,由正整数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;
}
}
上一篇: java引用jpython的方法示例
下一篇: new一个对象竟然不是原子操作?