左神算法笔记-二叉树的打印

58 阅读1分钟

先序打印

leetcode.cn/problems/bi…

public List<Integer> preorderTraversal(TreeNode root) {
    List<Integer> ans = new ArrayList<>();
    if (null == root) {
        return ans;
    }
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode temp = stack.pop();
        ans.add(temp.val);
        // 先序遍历 根左右,栈是先进后出,所以先push右
        if (temp.right != null) {
            stack.push(temp.right);
        }
        if (temp.left != null) {
            stack.push(temp.left);
        }
    }
    return ans;
}

中序打印

leetcode.cn/problems/bi…

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> ans = new ArrayList<>();
    if (null == root) {
        return ans;
    }
    Stack<TreeNode> stack = new Stack<>();
    // 中序是左根右
    while (root != null || !stack.isEmpty()) {
        if (root != null) {
            // 将整个树的左边全入栈
            stack.push(root);
            root = root.left;
        } else {
            // 弹出就打印
            root = stack.pop();
            ans.add(root.val);
            root = root.right;
        }
    }
    return ans;
}

后序打印

leetcode.cn/problems/bi…

public List<Integer> postorderTraversal(TreeNode root) {
    List<Integer> ans = new ArrayList<>();
    if (null == root) {
        return ans;
    }
    // 类似先序遍历,`根左右` -> `根右左` -> `左右根`
    Stack<TreeNode> stack = new Stack<>();
    // collect 存放 `根右左`
    Stack<TreeNode> collect = new Stack<>();

    stack.push(root);
    while (!stack.isEmpty()) {
        root = stack.pop();
        collect.push(root);

        if (root.left != null) {
            stack.push(root.left);
        }
        if (root.right != null) {
            stack.push(root.right);
        }
    }
    // 倒转返回
    while (!collect.isEmpty()) {
        ans.add(collect.pop().val);
    }
    return ans;
}