leetcode104[二叉樹的層次遍歷]

給定一個二叉樹,返回其節點值自底向上的層次遍歷。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)

例如:
給定二叉樹 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其自底向上的層次遍歷爲:

[
  [15,7],
  [9,20],
  [3]
]

思路:利用棧和隊列的性質。

根節點不爲空,將其入列,循環遍歷每一層節點。

從左向右遍歷當前層,該層的節點數爲隊列中的元素數。將當前節點的非空左右子樹分別進隊列中,然後當前節點出隊列,將其值保存在數組中。遍歷完該層節點後將數組入棧,清空數組,進行下一層的遍歷。

自頂向下遍歷並將每一層的節點值數組存儲在棧中,隊列爲空時遍歷完成,彈出棧的順序就是自底向上遍歷的順序。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        Stack<List<Integer>> stack = new Stack<>();
        if(root!=null)
            queue.offer(root);

        while(!queue.isEmpty()){
            List<Integer> temp = new ArrayList<>();
            int size = queue.size();

            for(int i =0;i<size;++i)
            {
                TreeNode node = queue.poll();                
                if(node.left!=null)
                    queue.offer(node.left);
                if(node.right!=null)
                    queue.offer(node.right);
                temp.add(node.val);
            }
            stack.push(temp);
        }  
        while(!stack.empty())  
            ans.add(stack.pop());
        return ans;
    }

}

 

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