♥(。→v←。)♥本人小玥,大数据专业,算法小白一个,努力学习中!!!🤒🤒🤒
点个关注,咱们来玥方长!!!
🤖题目:整数1,2,3,...组成了一颗特殊二叉树,如图7.7所示,已知这个二叉树的最后一个结点为n。设计一个算法输入m和n,求结点m所在的子树(简称结点m的子树)中一共包括多少个结点(假设n,m均为正整数,n<m)?
例子:
输入:n=12,m=3
输出:"结点m所在的子树中共有4个结点
一、🥳小玥解题思路:
🤡可以看出,该特殊二叉树是一颗完全二叉树,编号是层序编号。
结点m的深度为dep1=
结点n的深度为dep2=
1~dep2-1层是满的,两者的差为d=dep2-dep1,完全二叉树的子树也是一颗完全二叉树
🤡结点m的子树至少是一颗高度为d的,如图7.8所示
🤡阴影部分,它的结点个数为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); } } }
🤖运行结果:
🤒🤒🤒你学废了么?小玥学废了!!!😇😇😇