标签:
如上所示,由正整数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)。最后一组测试数据中包括两个0,表示输入的结束,这组数据不用处理。
对于每一组测试数据,输出一行,该行包含一个整数,给出结点m所在子树中包括的结点的数目。
3 12 0 0
4
最直接的二叉树遍历思想:
1 import java.util.Scanner; 2 public class Main{ 3 static int answer; 4 static int N,M; 5 public static void fun(int m){ 6 if(m<=N){ 7 answer++; 8 } 9 else 10 return; 11 fun(2*m); 12 fun(2*m+1); 13 } 14 public static void main(String[] args){ 15 Scanner in=new Scanner(System.in); 16 while(in.hasNext()){ 17 M=in.nextInt(); 18 N=in.nextInt(); 19 if(M==0&&N==0){ 20 break; 21 } 22 answer=0; 23 fun(M); 24 System.out.println(answer); 25 } 26 } 27 } 28 /************************************************************** 29 Problem: 1113 30 User: 0000H 31 Language: Java 32 Result: Time Limit Exceed 33 ****************************************************************/
优化思想:每次把遍历到属于m子数的那一层全部计算个数
1 import java.util.Scanner; 2 public class Main{ 3 public static void main(String[] args){ 4 Scanner in=new Scanner(System.in); 5 while(in.hasNext()){ 6 int m=in.nextInt(); 7 int n=in.nextInt(); 8 if(n==0&&m==0){ 9 break; 10 } 11 int answer=1; 12 if(n>=m){ 13 int left=2*m; 14 int right=2*m+1; 15 while(right<=n){ 16 answer+=right-left+1; 17 right=2*right+1; 18 left=2*left; 19 } 20 if(left<=n){ 21 answer+=n-left+1; 22 } 23 } 24 25 System.out.println(answer); 26 } 27 } 28 } 29 /************************************************************** 30 Problem: 1113 31 User: 0000H 32 Language: Java 33 Result: Accepted 34 Time:90 ms 35 Memory:15492 kb
标签:
原文地址:http://www.cnblogs.com/qq1029579233/p/4418852.html