📌  相关文章
📜  inorder (1)

📅  最后修改于: 2023-12-03 15:01:24.652000             🧑  作者: Mango

Inorder 遍历

Inorder 遍历是二叉树遍历的一种方式,它是一种深度优先搜索(DFS)的算法。在 inorder 遍历中,首先访问左子树,然后访问根节点,最后访问右子树。因此,如果我们将一棵二叉树按照 inorder 遍历的顺序输出,那么得到的序列就是按照二叉树中节点的大小顺序排列的。

下图是一棵二叉树,它的 inorder 遍历结果为 [4, 2, 5, 1, 6, 3, 7]

inorder example

递归实现

我们可以使用递归来实现 inorder 遍历。代码如下:

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

def inorder_traversal(root: TreeNode) -> List[int]:
    if not root:
        return []
    ans = []
    ans.extend(inorder_traversal(root.left))
    ans.append(root.val)
    ans.extend(inorder_traversal(root.right))
    return ans

在这个算法中,我们首先判断当前节点是否为空,如果为空则返回空列表。如果不为空,我们递归访问当前节点的左子树,在访问完左子树后,将当前节点的值加入到结果列表中,然后递归访问当前节点的右子树。最后返回结果列表。

迭代实现

我们也可以使用迭代的方式来实现 inorder 遍历。我们需要使用一个栈来保存还未访问的节点,然后我们从根节点开始遍历,依次将遍历到的节点和它的左子树加入到栈中。当没有左子树可以遍历时,我们从栈中弹出一个节点并访问它,然后将指针指向它的右子树,以此类推,直到栈为空。代码如下:

def inorder_traversal(root: TreeNode) -> List[int]:
    ans, stack = [], []
    while stack or root:
        if root:
            stack.append(root)
            root = root.left
        else:
            node = stack.pop()
            ans.append(node.val)
            root = node.right
    return ans

在这个算法中,我们使用了一个栈来保存还未遍历的节点。运行时间复杂度为 $O(n)$,其中 $n$ 是二叉树中节点的数量,空间复杂度为 $O(h)$,其中 $h$ 是二叉树的高度。