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

简介: 有一幅二叉树, 最大深度为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天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
43 5
|
2月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
2月前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
67 5
|
3月前
|
人工智能 自然语言处理 算法
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07(下)
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07(下)
35 2
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07(下)
|
3月前
|
机器学习/深度学习 人工智能 算法
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-05(下)
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-05(下)
34 1
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-05(下)
|
2月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
51 0
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19
71 3
|
3月前
|
存储 人工智能 算法
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-13(上)
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-13(上)
50 2
|
3月前
|
传感器 自然语言处理 安全
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07(上)
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07(上)
47 2
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-16
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-16
47 1

热门文章

最新文章