1. 程式人生 > 實用技巧 >LeetCode94-二叉樹的中序遍歷

LeetCode94-二叉樹的中序遍歷

非商業,LeetCode連結附上:

https://leetcode-cn.com/problems/binary-tree-inorder-traversal/

進入正題。

題目:

給定一個二叉樹的根節點root,返回它的中序遍歷。

示例:

示例 1:

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

示例 2:

輸入:root = []
輸出:[]

程式碼實現:

//節點
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }
}

//方法一 遞迴
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        
        List<Integer> res = new ArrayList<>();
        inOrder(root, res);
        return res;

    }

    public void inOrder(TreeNode root, List<Integer> res) {

        if(root == null) {
            return;
        }
        inOrder(root.left, res);
        res.add(root.val);
        inOrder(root.right, res);
    }
}
//時間複雜度O(n),空間複雜度O(n)

//方法二 迭代(棧)
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        
        List<Integer> res = new ArrayList<>();
        Deque<TreeNode> stack = new LinkedList<>();

        while (root != null || !stack.isEmpty()) {

            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            res.add(root.val);
            root = root.right;
        }
        
        return res;

    }
}
//時間複雜度O(n),空間複雜度O(n)

分析:

二叉樹的中序遍歷就是按“左-中-右”的順序遍歷所有的節點;

二叉樹的遍歷,遞迴需要更抽象的思考,怎樣設定結束條件,如何“遞”、怎麼“歸”;

迭代的方法是充分的利用棧的性質,將root節點及所有的左節點依次入棧,當不再有左節點時出棧,並將當前節點的右節點作為新的root節點遍歷。

--End