Leetcode題目94.二叉樹的中序遍歷(中等)

題目描述:java

給定一個二叉樹,返回它的中序遍歷。node

示例:

輸入: [1,null,2,3]
   1
    \
     2
    /
   3

輸出: [1,3,2]
進階: 遞歸算法很簡單,你能夠經過迭代算法完成嗎?

思路解析:算法

1)遞歸:沒啥說的,左子樹->根->右子樹順序去遍歷函數

2)迭代計算:用棧,再用一個指針模擬訪問過程指針

代碼實現:blog

1)遞歸遞歸

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
       //返回該二叉樹的中序遍歷
    public static List<Integer> inorderTraversal(TreeNode root) {

        List<Integer> res = new ArrayList<>();
        dfsTraversal(res, root);
        return res;
    }

    private static void dfsTraversal(List<Integer> res, TreeNode root) {
        if (root == null) {
            return;
        }
        dfsTraversal(res, root.left);
        res.add(root.val);
        dfsTraversal(res, root.right);
    }
}

2)迭代:it

    public static List<Integer> inorderTraversal(TreeNode root) {

        //藉助一個佔來實現
        List<Integer> res = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        if (root == null) {
            return res;
        }
        TreeNode pNode = root;
        while (!stack.isEmpty() || pNode != null) {
            while (pNode != null) {
                stack.push(pNode);
                pNode = pNode.left;
            }
            //出棧,彈出元素加入結果集
            TreeNode node = stack.pop();
            res.add(node.val);
            pNode = node.right;
        }
        return res;
    }

時間複雜度:O(n)。遞歸函數 T(n)=2⋅T(n/2)+1。
空間複雜度:最壞狀況下須要空間O(n)(每一個節點只有一顆子樹),平均狀況爲O(logn)(滿二叉樹結構排列)。io

相關文章
相關標籤/搜索