Leetcode題解中級篇之鏈表(10)中序遍歷二叉樹

題目:https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/32/trees-and-graphs/85/

題目描述:

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

示例:

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

輸出: [1,3,2]

進階: 遞歸算法很簡單,你可以通過迭代算法完成嗎?

 

思路:

遞歸 :在類中添加一個列表記錄每個遍歷到的值,寫一個遞歸函數按照中序遍歷訪問.

1.如果當前節點爲空返回.如果當前節點左孩子不爲空,遞歸調用它.

2.再將當前節點的值添加到列表中.

3.如果當前節點右孩子不爲空,遞歸調用它.

迭代:先訪問所有左孩子,利用棧存放訪問經過的父節點,當沒有左子節點時,再彈出棧,並訪問出棧節點的右孩子.對棧中每個節點都做次操作.如果右子節點的左孩子不爲空,繼續進棧直到,左孩子爲空.重複上述步驟.

//遞歸
public class Solution {
    private List<Integer> traversal = new ArrayList<>();
    private void traverse(TreeNode root) {
        if (root == null) return;
        if (root.left != null) traverse(root.left);
        traversal.add(root.val);
        if (root.right != null) traverse(root.right);
    }
    public List<Integer> inorderTraversal(TreeNode root) {
        traverse(root);
        return traversal;
    }
}

//迭代 
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
    ArrayList<Integer> result = new ArrayList<>();
        if (root == null) return result;

        ArrayDeque<TreeNode> stack = new ArrayDeque<>();

        do {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            result.add(root.val);
            root = root.right;
        } while (!stack.isEmpty() || root != null);

        return result;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章