二叉树的中序遍历(In-order Traversal)是一种深度优先遍历(DFS)的方式,它按照“左子树-根节点-右子树”的顺序访问二叉树的每个节点。这种遍历方式在二叉搜索树(BST)中尤其有用,因为它会按照从小到大的顺序访问所有节点。
实现二叉树的中序遍历有几种常见的方法:递归方法、迭代方法(使用栈)和莫里斯遍历(Morris Traversal,一种不需要额外空间的迭代方法)。
递归方法
递归方法是最直观的实现方式。
python复制代码
class TreeNode: | |
def __init__(self, val=0, left=None, right=None): | |
self.val = val | |
self.left = left | |
self.right = right | |
def inorderTraversal(root): | |
result = [] | |
def inorder(node): | |
if node: | |
inorder(node.left) # 遍历左子树 | |
result.append(node.val) # 访问根节点 | |
inorder(node.right) # 遍历右子树 | |
inorder(root) | |
return result |
迭代方法(使用栈)
迭代方法通过显式地使用栈来模拟递归调用栈的行为。
python复制代码
def inorderTraversalIterative(root): | |
stack, result = [], [] | |
current = root | |
while current or stack: | |
while current: | |
stack.append(current) | |
current = current.left # 尽可能向左遍历 | |
current = stack.pop() # 弹出栈顶元素,即最左的节点 | |
result.append(current.val) # 访问节点 | |
current = current.right # 转向右子树 | |
return result |
莫里斯遍历(Morris Traversal)
莫里斯遍历是一种利用叶子节点的空指针域,实现空间复杂度为O(1)的中序遍历方法。
python复制代码
def inorderTraversalMorris(root): | |
result = [] | |
current = root | |
while current: | |
if current.left is None: | |
result.append(current.val) | |
current = current.right | |
else: | |
# 找到前驱节点,即左子树中最右边的节点 | |
predecessor = current.left | |
while predecessor.right and predecessor.right != current: | |
predecessor = predecessor.right | |
# 如果前驱节点的右指针为空,则将其指向当前节点 | |
# 并遍历左子树 | |
if predecessor.right is None: | |
predecessor.right = current | |
current = current.left | |
else: | |
# 否则,恢复前驱节点的右指针 | |
# 访问当前节点,并遍历右子树 | |
result.append(current.val) | |
predecessor.right = None | |
current = current.right | |
return result |
以上是实现二叉树中序遍历的三种主要方法。每种方法都有其特点和适用场景,可以根据具体需求选择合适的方法。