zoukankan      html  css  js  c++  java
  • 题目1113:二叉树

    题目描述:

     


        如上所示,由正整数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
  • 相关阅读:
    QuantLib 金融计算——案例之固息债的关键利率久期(KRD)
    Elasticsearch 最佳运维实践
    Ansible常用的Ansible Module
    中国七夕节( Chinese Valentine's Day)IT的浪漫情结
    Leetcode之C++刷题生死战
    无需Root可自动定时发送微信和短信的黑科技APP,支持跳过开屏启动广告
    tmp
    【整理中】可靠性基础_抽样检测
    【汇总】命名及标识
    Treelist父节点上下移
  • 原文地址:https://www.cnblogs.com/qq1029579233/p/4418852.html
Copyright © 2011-2022 走看看