返回

深入浅出:巧妙避开,揭秘非凡中序

人工智能

导言

Leetcode 94 题,以其中等难度和极高的通过率,在算法领域广受追捧。这道基础题要求我们运用中序,优雅地探访二叉树。然而,跳出常规,避开繁琐的寻根问底,我们将揭晓一项巧妙的技术——莫里斯中序(Morris Inorder)。

突破局限,领略非凡

传统中序算法依靠左右子树的反复递进,构成了经典的「分而治之」范式。而莫里斯中序,反其道而行,将二叉树的结构悄然重塑,开辟了中序的另一条蹊径。

莫里斯中序的精髓

莫里斯中序的核心思想,在于将子树当作线程,巧妙穿针引线,逐一拜访节点。它以当前节点为基准,根据其右子树的指向,进行巧妙的「接驳」和「断链」。

  • 接驳: 若右子树存在,则将当前节点的右指针指向其最左子节点,形成「线程」。
  • 断链: 若右子树不存在,则将当前节点的右指针指向其父节点,切断「线程」。

算法流程

莫里斯中序的具体流程如下:

  1. 初始化当前节点为根节点。
  2. 若当前节点的右指针指向「线程」,则访问该节点,转至步骤 5。
  3. 否则,访问当前节点,继续步骤 4。
  4. 将当前节点的右指针指向其右子树的最左子节点,形成「线程」。
  5. 将当前节点的左指针指向其父节点,切断「线程」。
  6. 若当前节点有父节点,则将当前节点更新为其父节点,转至步骤 2。
  7. 若当前节点无父节点,则算法结束。

代码示例

Python 代码示例如下:

def morris_inorder(root):
    if not root:
        return

    while root:
        if root.right and root.right.left is root:
            # 访问节点
            print(root.val)
            # 断开线程
            root.right.left = None
            # 更新当前节点
            root = root.right
        else:
            # 接上线程
            while root.left:
                root = root.left
            # 访问节点
            print(root.val)
            # 切断线程
            root.right = root.parent
            # 更新当前节点
            root = root.parent

总结

莫里斯中序,是一种非凡的技术,避开了传统的递进方式,巧妙利用了二叉树的结构,为中序树的访问开辟了新的途径。它的简捷和高效,让它在算法领域备受推崇,成为了算法竞赛中的必备利器。掌握莫里斯中序,让我们在算法世界中更进一步,领略非凡的魅力。