二叉树查找算法(一)

♥(。→v←。)♥本人小玥,大数据专业,算法小白一个,努力学习中!!!🤒🤒🤒

点个关注,咱们来玥方长!!!

🤖题目:整数1,2,3,...组成了一颗特殊二叉树,如图7.7所示,已知这个二叉树的最后一个结点为n。设计一个算法输入m和n,求结点m所在的子树(简称结点m的子树)中一共包括多少个结点(假设n,m均为正整数,n<m)?

例子:

输入:n=12,m=3

输出:"结点m所在的子树中共有4个结点

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2l546l5pa56ZW_,size_20,color_FFFFFF,t_70,g_se,x_16

一、🥳小玥解题思路:

🤡可以看出,该特殊二叉树是一颗完全二叉树,编号是层序编号。

结点m的深度为dep1=gif.latex?%5Cleft%20%5Clfloor%20log2m%20%5Cright%20%5Crfloor&plus;1

结点n的深度为dep2=gif.latex?%5Cleft%20%5Clfloor%20log2%28n&plus;1%29%20%5Cright%20%5Crfloor

1~dep2-1层是满的,两者的差为d=dep2-dep1,完全二叉树的子树也是一颗完全二叉树

🤡结点m的子树至少是一颗高度为d的,如图7.8所示

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2l546l5pa56ZW_,size_20,color_FFFFFF,t_70,g_se,x_16

🤡阴影部分,它的结点个数为ans=2^d-1。

这最多是一颗高度为d+1的满二叉树。其中第d+1层的结点个数为k=2^d,子树中该层的起始结点编号为start=m*k,子树的终止结点为end=start+k。


 二、👿实现代码

import java.util.Scanner;  //如果使用vs code运行,有时可能运行会出现报错,再次运行即可。
public class Exam7_5 {
    public static void main(String[] args)
    {
        /****m为结点编号,n为最后一个结点的编号,其中m<=n ********/
        int m,n;
        System.out.println("请输入m=");
        Scanner fin=new Scanner(System.in);
        while(fin.hasNext())
        {
            m=fin.nextInt();
            System.out.println("请输入n=");
            n=fin.nextInt();
            if(m==0 && n==0) break;
            int dep1=(int)(Math.log(m)/Math.log(2))+1; //m结点的层次
            int dep2=(int)(Math.log(n)/Math.log(2))+1; //n结点的层次
            int d=dep2-dep1;                     //求出层次差
            int ans,k;
            ans=(int)Math.pow(2.0,d)-1;  //高度为d的满二叉树的结点个数
            k=(int)Math.pow(2.0,d);    //满二叉树中第d+1层的结点个数
            int start=m*k;          //子树最下层的起始结点编号
            int end=start+k;    //子树最下层的可能终止结点编号
            if(end<=n)       //子树为d+1层的满二叉树
                ans+=k;
            else{          //其他情况
                if(start<=n)
                    ans+=(n-start+1);
            }
            System.out.println("m所在的子树的结点数为:"+ans);
        }
       
    }
    
}

🤖运行结果: 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2l546l5pa56ZW_,size_11,color_FFFFFF,t_70,g_se,x_16

🤒🤒🤒你学废了么?小玥学废了!!!😇😇😇 

 

 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来玥方长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值