Vertical Tree Traversal in Java

2025 年 5 月 9 日 | 阅读 9 分钟

Java 垂直树遍历涉及根据二叉树节点与根的水平距离,逐列地组织和打印节点。通过使用 TreeMap 和层序遍历,节点被分组并按垂直顺序显示,确保树的结构化视图。

输入

具有以下结构的二叉树

输出

 
[4]  
[2]  
[1, 5, 6]  
[3]  
[7]   

解释

节点按其水平距离 (HD) 分组

  • HD = -2: [4]
  • HD = -1: [2]
  • HD = 0: [1, 5, 6]
  • HD = 1: [3]
  • HD = 2: [7]

暴力破解法

方法按水平距离对节点进行分组,并逐层处理它们,以确保二叉树的结构化垂直顺序遍历。

算法

步骤 1: 创建一个 TreeMap 来存储每个水平距离 (HD) 的节点。

步骤 2: 从根开始,将其添加到队列中,HD = 0。

步骤 3: 处理每个节点

  • 将节点的 H D 添加到 TreeMap 中。
  • 将左子节点添加到队列中,HD 减 1;将右子节点添加到队列中,HD 加 1。

步骤 4: 重复此过程,直到所有节点都被处理(队列为空)。

步骤 5: 通过按 HD 顺序从 TreeMap 中读取值来打印结果。

实施

输出

 
[4]
[2]
[1, 5, 6]
[3]
[7]  

时间复杂度: O(N log N),其中 N 是节点数(由于 TreeMap 插入)。

空间复杂度: O(N),用于 TreeMap 和队列。

使用二叉树方法

该方法使用层序遍历和队列,根据节点与根的水平距离 (HD) 来分组节点。TreeMap 以排序方式存储每个 HD 的节点,确保了垂直对齐。

算法

步骤 1: 初始化一个 TreeMap 用于按水平距离 (HD) 存储节点,并初始化一个队列用于层序遍历。添加根节点,HD = 0。

步骤 2: 从队列中处理每个节点,将其值添加到其 HD 下方的 TreeMap 中。

步骤 3: 如果存在,将左子节点添加到队列中,HD 减 1;将右子节点添加到队列中,HD 加 1。

步骤 4: 重复此过程,直到队列为空。

步骤 5: 从 TreeMap 中打印按 HD 分组的节点。

实施

输出

 
Vertical Traversal of the Binary Tree:
[4]
[2]
[1, 5, 6]
[3]
[7]   

时间复杂度: O(N log N)

空间复杂度: O(N)

使用 HashMap 方法

该代码使用 HashMap 来根据节点与根的水平距离 (HD) 对节点进行分组。层序遍历可确保系统地访问节点,并且键 (HD) 被排序以实现有序垂直遍历。

算法

步骤 1: 如果根节点为空,则从函数返回。

步骤 2: 创建一个 HashMap 来存储按水平距离 (HD) 分组的节点。

步骤 3: 使用队列处理节点,并添加其左子节点和右子节点,并更新 HD 值。

步骤 4: 从 HashMap 中提取键 (HD),并按升序对其进行排序。

步骤 5: 对于每个排序后的 HD,打印存储在 HashMap 中的节点。

实施

输出

 
Vertical Traversal of the Binary Tree:
[4]
[2]
[1, 5, 6]
[3]
[7]