📌  相关文章
📜  使用O(1)空间在O(N)中二叉树的后序遍历(1)

📅  最后修改于: 2023-12-03 14:49:49.256000             🧑  作者: Mango

使用O(1)空间在O(N)中二叉树的后序遍历

在二叉树的后序遍历中,我们先访问左子树,再访问右子树,最后访问根节点。使用递归的方式很容易实现后序遍历,但是递归会使用O(N)的系统栈空间,不符合要求。

我们可以使用迭代的方式来实现后序遍历,并且只使用O(1)的额外空间。具体的实现可以借助栈来辅助完成。

以下是用于实现O(1)空间复杂度后序遍历的代码片段:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def postorderTraversal(root):
    if not root:
        return []

    result = []
    stack = []
    prev = None

    while root or stack:
        while root:
            stack.append(root)
            root = root.left
        
        root = stack[-1]

        # 检查右子树是否已经访问过,或者右子树为空
        if not root.right or root.right == prev:
            node = stack.pop()
            result.append(node.val)
            prev = node
            root = None
        else:
            root = root.right

    return result

此代码使用了迭代和栈来实现后序遍历。核心思想是从根节点开始,先对左子树进行深度遍历,并将遍历过程中经过的节点加入栈中。当树的左子树遍历完成后,再从栈中弹出节点并判断其右子树是否已经被访问过或为空,如果是则将该节点加入结果列表中,否则将右子树入栈并继续迭代。

这种方法的时间复杂度为O(N),空间复杂度为O(1),符合要求。

希望以上介绍对您有帮助!