【47.二叉树的中序遍历】

106 阅读1分钟

题目

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

输入: root = [1,null,2,3]
输出: [1,3,2]

题解

方式一:递归

复杂度:O(n) 每个节点访问一次

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> result = new LinkedList<>();
    inorder(root, result);
    return result;
}

public void inorder(TreeNode node, List<Integer> result) {
    if (node == null) {
        return;
    }
    // 左子树
    inorder(node.left, result);
    // 根节点
    result.add(node.val);
    // 右子树
    inorder(node.right, result);
}

方式二:迭代

public List<Integer> inorderTraversal(TreeNode root) {
    // 显式维护递归时的栈
    Stack<TreeNode> stack = new Stack<>();
    List<Integer> result = new LinkedList<>();
    while (!stack.isEmpty() || root != null) {
        // 将当前节点及其所有左节点压栈
        while (root != null) {
            stack.push(root);
            root = root.left;
        }
        // 栈顶取出当前节点
        root = stack.pop();
        result.add(root.val);
        // 处理当前节点的右节点,如果右节点是null,则下次处理的是当前节点的父节点
        root = root.right;
    }
    return result;
}

总结

算法:递归迭代