📅  最后修改于: 2023-12-03 15:01:24.652000             🧑  作者: Mango
Inorder 遍历是二叉树遍历的一种方式,它是一种深度优先搜索(DFS)的算法。在 inorder 遍历中,首先访问左子树,然后访问根节点,最后访问右子树。因此,如果我们将一棵二叉树按照 inorder 遍历的顺序输出,那么得到的序列就是按照二叉树中节点的大小顺序排列的。
下图是一棵二叉树,它的 inorder 遍历结果为 [4, 2, 5, 1, 6, 3, 7]
。
我们可以使用递归来实现 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$ 是二叉树的高度。