Tree Boundary Traversal in Java

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

树边界遍历是一种二叉树遍历的专用技术,其中节点以特定顺序访问,以覆盖树的外部边界。在此遍历中,我们的目标是访问位于树外围的节点,包括左边界、所有叶节点和右边界。遍历遵循结构化方法,涵盖

  1. 左边界(从上到下,不包括叶节点),
  2. 叶节点(跨所有级别的从左到右),
  3. 右边界(从下到上,不包括叶节点)。

此遍历对于可视化树的轮廓很有用,并且可以应用于图形表示、分层数据处理和空间结构等应用。

算法

步骤 1: 打印根节点的值(如果它不为 null)。

步骤 2: 沿着左边缘向下遍历,打印非叶节点,直到到达最左边的边界。

步骤 3: 通过遍历左子树和右子树,从左到右打印所有叶节点。

步骤 4: 沿着树的右边缘自下而上遍历,打印非叶节点,直到到达根节点。

步骤 5: 这将显示树的完整边界遍历。

实施

文件名:BinaryTree.java

输出

 
15 10 5 11 13 25 20    

时间复杂度: O(N),其中 N 是树中的节点数。

辅助空间复杂度: O(H),其中 H 是树的高度。

逆时针边界遍历

逆时针边界遍历是一种以逆时针方向遍历二叉树边界节点的技术。它涉及按顺序收集节点:根、左边界(不包括叶节点)、叶节点(从左到右)和右边界(不包括叶节点,逆序)。

算法

步骤 1: 如果根节点不是叶节点,则将其添加到边界列表中。

步骤 2: 从根节点的左子节点开始,沿着左边缘(不包括叶节点)将每个节点添加到边界列表,如果可能则移动到左子节点,否则移动到右子节点。

步骤 3: 遍历整个树以查找所有叶节点(没有子节点的节点)并将其添加到边界列表中。

步骤 4: 从根节点的右子节点开始,将沿右边缘(不包括叶节点)的每个节点添加到堆栈中,如果可能则移动到右子节点,否则移动到左子节点。

步骤 5: 按相反顺序将堆栈中的节点添加到边界列表中,以完成边界遍历。

实施

文件名:BinaryTree.java

输出

 
50 30 10 35 45 90 70    

时间复杂度: O(N),其中 N 是节点数。

辅助空间复杂度: O(H),其中 H 是树的高度。

使用 Morris 遍历方法

Morris 遍历是一种中序遍历方法,它通过在 二叉树 中创建临时链接(线程)来避免递归或堆栈。它能够以O(1)的辅助空间进行高效遍历,同时在过程结束后保留树的结构。

算法

步骤 1: 从根节点开始。打印其值。

步骤 2: 沿着树的左侧向下移动,打印非叶节点。

步骤 3: 遍历整个树(左子树和右子树),并打印所有叶节点。

步骤 4: 沿着树的右侧向下移动,存储非叶节点。以相反的顺序打印它们。

步骤 5: 将根节点、左边界、叶节点和右边界(逆序)的值组合起来,得到完整的边界遍历。

实施

文件名:BinaryTree.java

输出

 
50 30 10 35 45 90 70    

时间复杂度: O(N),其中 N 是节点数。

辅助空间: O(H),其中 H 是树的高度。


下一主题& vs && in Java