LeetCode-94. 二叉樹的中序遍歷

LeetCode-94. 二叉樹的中序遍歷

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

示例:

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

輸出: [1,3,2]

思路

分爲遞歸版本和非遞歸版本。

遞歸

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
 /**
    遞歸版本
 */
class Solution {

    List<Integer> res=new ArrayList<>();

    public List<Integer> inorderTraversal(TreeNode root) {

        if(root==null)
        {
            return res;
        }
        res=(inorderTraversal(root.left));
        res.add(root.val);
        res=(inorderTraversal(root.right));

        return res;

    }
}

非遞歸

中序遍歷的順序是左根右,而我們只能從root開始,要麼向左遍歷,要麼向右遍歷。我們可以先一直向左遍歷,直到某個葉子節點,然後將遍歷過程中的所有節點存入一個棧中。

接下來要看看這個葉子節點的右子樹,對它的右子樹,我們依然按照上述步驟來一遍。

如果它沒有右子樹,就出棧,繼續看這個出棧的節點有木有右子樹。

用一個變量指針和一個棧就可以搞定。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
 /**非遞歸版本*/
class Solution {
    
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res=new ArrayList<Integer>();
        Stack<TreeNode> stack=new Stack<>();

        TreeNode cur=root;
        while(cur!=null || !stack.isEmpty())
        {
            while(cur!=null)
            {
                stack.push(cur);
                cur=cur.left;
            }        
            cur=stack.pop();
            res.add(cur.val);
            //複用指針,cur要麼是空,如果不是空,就重複以上步驟,壓入以cur爲根的子樹的所有左邊節點。
            //一個非空節點就能代表一棵樹
            cur=cur.right;
        }
        return res;      
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章