Java 中用于先序遍历的 Morris 遍历

2024 年 9 月 10 日 | 阅读 3 分钟

在本节中,我们将学习Java 中的莫里斯前序遍历。在莫里斯遍历中,我们无需递归或堆栈即可完成树的遍历。莫里斯遍历基于线索二叉树。

莫里斯前序遍历算法

以下是莫里斯前序遍历的算法,它几乎与莫里斯中序遍历相似。

  1. 如果左子节点为空,则显示当前节点的数据,然后移动到右子节点。
    否则,请确保中序前驱节点的右子节点指向当前节点。
    出现两种情况
    1. 如果当前节点被中序前驱节点的右子节点指向,则将右子节点设置为 NULL,然后移动到当前节点的右子节点。
    2. 如果右子节点为空,则将其设置为当前节点。显示当前节点的数据,然后移动到当前节点的左子节点。
  2. 重复此过程,直到当前节点不等于 NULL。

实施

让我们看看使用上述算法实现的莫里斯前序遍历。

文件名: BTree1.java

输出

The preorder traversal of the binary tree is: 
6 8 1 4 5 9 7

时间复杂度: 由于该算法与莫里斯中序遍历相似。因此,上述程序的总时间复杂度为 O(n)。

注意:在许多地方,人们说递归方法进行前序遍历不消耗任何空间。但这并不完全正确。在递归中,即使我们没有显式提供堆栈,也会使用堆栈。

莫里斯遍历可以在二叉树内部修改的帮助下工作。如果没有内部修改,莫里斯遍历将无法工作。因此,如果不允许内部修改,则应考虑莫里斯遍历。