#include <stdio.h> #include <math.h> int main() { int n,m,left,right; int count; int deep_n,deep_m,deep_diff; int i, j; for( scanf("%d%d",&m,&n); n!=0 && m!=0; scanf("%d%d",&m,&n) ) { count = 0; left = right = m; deep_n = (int)(log(n)/log(2)+1); //节点n的深度 deep_m = (int)(log(m)/log(2)+1); //节点m的深度 deep_diff = deep_n - deep_m; //两者的深度之差 //其实可以将m节点看成一个独立的子树的根节点,就能理解此处所想表达的意思了 //深度为deep的二叉树的节点个数为2^deep-1个,这样会好理解一点 count += (int)pow(2,deep_diff) - 1; for(i=1;i<=deep_diff;++i) { left = 2*left; right = 2*right+1; } if(right<=n) count += right - left + 1; else if(left<=n) count += n - left + 1; printf("%d\n",count); } return 0; }
九度 1113 关于二叉树节点的个数问题,布布扣,bubuko.com
原文地址:http://blog.csdn.net/daringpig/article/details/25488597