算法研究之二叉树小球下落

简介: 有一幅二叉树, 最大深度为D. 且所有叶子的深度都相同. 所有结点从上到下从左到 右编号为1,2,3.….2D- l . 在结点1 有一个小球,它会往下落. 每个内结点上都有一个开 关,初始全部关闭,当每在有小球落到个开关上时, 开关都会改变. 当小球到这一 个内结点时.如果该结点上的开夫先闭, 贝小球往左走, 否则往右走,直到走到叶子结点, 如 图6-8 所示. 一些小球从结点1 处佳次开始下落,最后一个小草将会落到哪里?输入叶子深度D和小球个N数输出第N 个小球最后所在的叶子编号. 这道题的关键就在于对于一个节点K,左孩子是2N,右孩子是2N+1。
有一幅二叉树, 最大深度为D. 且所有叶子的深度都相同. 所有结点从上到下从左到
右编号为1,2,3.….2D- l . 在结点1 有一个小球,它会往下落. 每个内结点上都有一个开
关,初始全部关闭,当每在有小球落到个开关上时, 开关都会改变. 当小球到这一
个内结点时.如果该结点上的开夫先闭, 贝小球往左走, 否则往右走,直到走到叶子结点, 如
图6-8 所示.


一些小球从结点1 处佳次开始下落,最后一个小草将会落到哪里?输入叶子深度D

和小球个N数输出第N 个小球最后所在的叶子编号.

这道题的关键就在于对于一个节点K,左孩子是2N,右孩子是2N+1。

import java.util.Scanner;

public class N {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int deep, num;
		while (true) {
			//输入二叉树的深度
			deep = sc.nextInt();
			//输入小球的个数
			num = sc.nextInt();
			boolean[] s = new boolean[1 << deep];
			//8 << n的值为8*(2^n)
			int MAX = (1 << deep) - 1;
			for (int i = 1; i <= num; i++) {
				int end = 1;
				while (true) {
					if (s[end] == false) {
						s[end] = true;
						end = end * 2;// 关键 左孩子是2N,右孩子是2N+1
					} else {
						s[end] = false;
						end = end * 2 + 1;
					}
					if (end > MAX) {
						break;
					}
				}
				if (i == num) {
					System.out.println(end / 2);
				}
			}
		}
	}
}

这种算法利用了一个数组s,但是我们可以发现,这个数组可能会有2^D-1大小,所以我们可以考虑另一种算法。

每个小球都会落在根节点上,因此开始的两个小球必然是一个在左子树,一个在右子树。一般的,只需看小球的奇偶性,就能知道他是最终停在哪颗子树上,对于那些落入根节点左子树的小球来说,只需知道该小球是第几个落在根的左子树里的,就可以知道他下一步往左还是往右了,以此类推,直到小球落在叶子上。

当小球个数num是奇数时,他是往左走的第(num+1)/2个小球,当num是偶数时,他是往右走的第num/2个小球,这样我们可以直接模拟最后一个小球的路线。

import java.util.Scanner;

public class N {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int deep, num;
		while (true) {
			// 输入二叉树的深度
			deep = sc.nextInt();
			// 输入小球的个数
			num = sc.nextInt();
			int end = 1;
			for (int j = 0; j < deep - 1; j++) {
				if (num % 2 == 1) {
					end = end * 2;
					num = (num + 1) / 2;
				} else {
					end = end * 2 + 1;
					num = num / 2;
				}
			}
			System.out.println(end);
		}
	}
}


目录
相关文章
|
11月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
853 0
|
11月前
|
存储 机器学习/深度学习 编解码
双选择性信道下正交啁啾分复用(OCDM)的低复杂度均衡算法研究——论文阅读
本文提出统一相位正交啁啾分复用(UP-OCDM)方案,利用循环矩阵特性设计两种低复杂度均衡算法:基于带状近似的LDL^H分解和基于BEM的迭代LSQR,将复杂度由$O(N^3)$降至$O(NQ^2)$或$O(iNM\log N)$,在双选择性信道下显著提升高频谱效率与抗多普勒性能。
564 0
双选择性信道下正交啁啾分复用(OCDM)的低复杂度均衡算法研究——论文阅读
|
12月前
|
传感器 机器学习/深度学习 算法
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
288 0
|
11月前
|
存储 监控 算法
基于 Go 语言跳表结构的局域网控制桌面软件进程管理算法研究
针对企业局域网控制桌面软件对海量进程实时监控的需求,本文提出基于跳表的高效管理方案。通过多级索引实现O(log n)的查询、插入与删除性能,结合Go语言实现并发安全的跳表结构,显著提升进程状态处理效率,适用于千级进程的毫秒级响应场景。
375 15
|
11月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
546 8
|
12月前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
440 14
|
12月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
593 3
|
12月前
|
canal 算法 vr&ar
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
301 1
|
12月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
262 3
|
12月前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
418 1

热门文章

最新文章