二叉树先根(先序)遍历的改进


在二叉树的先序遍历中,通常的遍历顺序是:根节点 -> 左子树 -> 右子树。这个遍历过程可以递归地执行,或者通过迭代(使用栈)来实现。这里,我提供一个迭代版本的改进,以优化遍历过程(尤其是针对空间复杂度)或增加一些功能(如记录遍历路径等)。

### 迭代版本的先序遍历改进

通常的迭代版本可能使用栈来模拟递归过程。我们可以考虑增加一个额外的数据结构(如列表)来记录遍历的结果,或者在遍历过程中执行额外的操作(如计算节点深度、检查特定条件等)。


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

def preorderTraversal(root):
    if not root:
        return []
    stack, result = [root], []
    while stack:
        node = stack.pop()
        result.append(node.val)  # 访问根节点
        if node.right:  # 先压入右子树,再压入左子树,保证左子树先被遍历
            stack.append(node.right)
        if node.left:
            stack.append(node.left)
    return result

# 示例使用
if __name__ == "__main__":
    # 构建一棵简单的二叉树
    #     1
    #    / \
    #   2   3
    root = TreeNode(1)
    root.left = TreeNode(2)
    root.right = TreeNode(3)

    print(preorderTraversal(root))  # 输出: [1, 2, 3]

### 改进点

1. **空间复杂度**:虽然这里使用了栈来存储待遍历的节点,但栈的使用是迭代遍历二叉树的常规做法,无法完全避免。不过,你可以通过优化栈的操作(如减少不必要的节点入栈)来稍微减少空间使用。

2. **功能扩展**:在遍历过程中,你可以很容易地加入额外的逻辑,如检查节点的值、计算节点的深度、或者对满足特定条件的节点执行特殊操作。

3. **非递归实现**:上面的示例使用了迭代(非递归)的方式来实现先序遍历,这有助于避免递归可能带来的栈溢出问题,尤其是在处理深度很大的树时。

注意,这个改进主要集中在迭代遍历的通用性和扩展性上,而没有对遍历本身的基本逻辑进行根本性的改变。如果你需要针对特定场景进行更深入的优化,可能需要具体分析该场景下的需求。