Java 中二叉树的垂直序遍历2025 年 8 月 17 日 | 阅读 9 分钟 在本节中,我们将讨论 Java 中二叉树的垂直序遍历 以及实现它的不同方法。在垂直序遍历中,我们从上到下垂直打印二叉树的节点。例如,考虑以下二叉树。 ![]() 垂直序遍历结果是 方法 1:使用水平距离在这种方法中,我们只遍历一次树,并将根作为参考点,找到最大和最小水平距离。假设二叉树的根节点位于距离 0 的位置。同样,假设向左走一步是 -1,向右走一步是 +1。对于上述二叉树,最小距离是 -2(值为 1 的节点),最大距离是 3(值为 19 的节点)。 在找到根节点到各节点的最小和最大距离后,遍历范围从最小距离到最大距离的每一条垂直线。在遍历每一条垂直线时,打印位于该垂直线上的节点(参见上图)。 实施让我们看一下使用水平距离方法实现二叉树垂直序遍历的示例。 文件名: VerticalTraversalExample.java 输出 The vertical order traversal of the binary tree is: 1 2 4 3 6 5 18 7 19 时间复杂度: 上述算法的时间复杂度为 O(wid * no),其中“wid”是给定二叉树的宽度,“no”是二叉树中的节点数。在最坏的情况下,wid 的值可以是 O(no)(例如,考虑一个完全二叉树),在这种情况下,时间复杂度可以变为 O(no2)。 方法 2:使用 TreeMap在前一种方法中,我们讨论了一种 O(no2) 的解决方案。在这种方法中,我们将使用 TreeMap,它能提供比 TreeMap 更好的解决方案。在这种方法中,也需要通过以根节点为参考点来检查所有节点的水平距离。与前一种方法类似,当我们移动到一个比根节点左边一个单位的节点时,水平距离被视为 -1。对于根节点的右侧节点,水平距离被视为 +1。在执行树的先序遍历时,我们可以计算水平距离。对于每个水平距离值,TreeMap 中都会维护一个节点列表。 实施让我们看一下使用 TreeMap 实现二叉树垂直序遍历的示例。 文件名: VerticalTraversalExample1.java 输出 The vertical order traversal of the binary tree is: [1] [2] [4, 3, 6] [5, 18] [7] [19] 时间复杂度: 上述解决方案基于哈希技术,其时间复杂度被认为是 O(n),其中 n 是二叉树中的总节点数。请注意,当使用良好的哈希方法来实现 O(1) 的检索和插入操作时,可以达到 O(n) 的时间复杂度。 方法 3:使用层序遍历可以使用 层序遍历 的概念来实现二叉树的垂直序遍历。我们借助队列来遍历节点。队列的每个元素都提供有关水平距离和二叉树节点的信息。 与其他方法类似,在此方法中,我们也通过将树的根节点作为参考点来查找水平距离。同样,从根节点向左移动会在每个连续节点上加 -1。类似地,从根节点向右移动会在每个连续节点上加 +1。在完成树的层序遍历后,我们逐个弹出队列中的元素。 如上图所示的垂直线可以被视为节点所在的层。可以通过水平距离 (horDis) 来确定哪个节点位于同一垂直线上。我们可以将这些节点放入一个 ArrayList 中,并且列表的对应项将是水平距离。我们将列表和水平距离放入一个 Map 中。最后,我们遍历 Map 来显示结果。 实施让我们看一下使用层序遍历实现二叉树垂直序遍历的示例。 文件名: VerticalTraversalExample1.java 输出 The vertical order traversal of the binary tree is: 1 2 4 3 6 5 18 7 19 时间复杂度: 上述程序的时间复杂度为 O(n),其中 n 是树中的总节点数。 |
借助 Java 编程语言的 switch case 语句,程序员可以轻松构建复杂的决策逻辑。在本节中,我们将探讨 switch case 语句的语法,讨论它们为何优于 if-else 语句,并提供一些使用示例。语法 switch 的基本语法...
阅读 6 分钟
在本节中,我们将讨论如何创建用于购物账单的 Java 程序。要生成购物账单,我们需要产品 ID、名称、数量、单价和产品的总价,以及总计金额。除了产品详细信息外,我们还可以添加……
阅读 12 分钟
多态是面向对象编程 (OOP) 中的一个基本概念。多态这个词指的是多种形式的存在。这种能力增强了代码的灵活性、模块化和可维护性。Java 中有两种类型的多态:编译时多态(静态多态)和运行时多态(动态多态)。编译时多态(静态绑定)编译时...
5 分钟阅读
在面向对象编程中,抽象被定义为隐藏用户不需要的细节(实现),而专注于基本信息(功能)。它提高了效率并降低了复杂性。在 Java 中,可以通过抽象类和抽象方法来实现抽象。抽象方法 在 Java 中,抽象方法是...
5 分钟阅读
java.time.format.DecimalStyle 类包含 getAvailableLocales() 方法。Java DecimalStyle 类用于检索与此 DecimalStyle 兼容的所有区域设置的列表。此方法返回可访问区域设置的集合。语法:public static Set<Locales> getAvailableLocales() 参数:无参数...
阅读 3 分钟
字符串压缩是计算机科学和编程中的一个基本问题,其目标是通过计算连续重复字符来压缩字符串。该问题的本质是更有效地表示字符串,尤其是在处理大型数据集时。这种技术在各种场景下都很有用...
7 分钟阅读
在本节中,我们将解决一个问题,我们需要计算二维矩阵中的“X”形状。矩阵中的字母可以是“X”或“O”,其中“X”代表形状的一部分,“O”代表空格。目标是...
阅读 6 分钟
编程不仅仅是解决复杂问题或创建功能软件;它也是一种艺术形式。探索编程的艺术一面的一种方法是使用代码创建精美的图案和设计。在本节中,我们将深入探讨迷人的世界……
5 分钟阅读
Java 接口变量 Java 接口提供了一种定义类实现契约或蓝图的方法。除了方法,接口还可以包含变量。这些变量称为接口变量或常量。请注意,接口变量是 public、static 和 final 的,由...
阅读 4 分钟
?Java 中有多种方法可以将日期转换为月份和年份的字符表示。一种典型的方法是使用 SimpleDateFormat 类根据预定义的模式格式化日期。使用 Calendar 类分离月份和...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India