📜  无递归的中序树遍历(1)

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

无递归的中序树遍历

中序遍历二叉树,是按照左子树、根节点、右子树的顺序遍历二叉树。常规的做法是使用递归实现,但是当二叉树较大或者递归深度较大时,会导致栈溢出等问题。因此,本文介绍一种无递归的中序树遍历方式。

算法思路

使用栈来模拟递归的过程,从根节点开始访问二叉树,将遍历到的节点压入栈中。当左子树遍历完成后,弹出栈顶元素,并访问它的右子树。

具体实现过程如下:

  1. 将根节点入栈;
  2. 如果栈非空,则取出栈顶元素,并访问它的左子树。将遍历到的节点依次入栈,直到左子树遍历完成;
  3. 弹出栈顶元素,访问它的右子树。
代码实现

以下是使用Java语言实现无递归的中序树遍历的代码片段:

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> result = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();
    TreeNode cur = root;
    while (cur != null || !stack.empty()) {
        // 将所有左子节点入栈
        while (cur != null) {
            stack.push(cur);
            cur = cur.left;
        }
        // 弹出栈顶元素,访问右子树
        cur = stack.pop();
        result.add(cur.val);
        cur = cur.right;
    }
    return result;
}
算法分析

时间复杂度为O(n),空间复杂度为O(n)。其中,n为二叉树的节点数。

总结

本文介绍了一种无递归的中序树遍历方式,并给出了Java代码实现。这种算法的时间复杂度为O(n),空间复杂度为O(n)。相比递归方式,无递归的中序树遍历方式可以有效避免栈溢出等问题,是一种更为安全的解决方案。