劍指Offer-從上往下打印二叉樹Java

22、從上往下打印二叉樹

題目描述:
從上往下打印出二叉樹的每個節點,同層節點從左至右打印。

思路:
用隊列存儲節點。

import java.util.ArrayList;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        ArrayList<Integer> al = new ArrayList<>();
        if(root==null){return al;}
        ArrayList<TreeNode> queue = new ArrayList<>();//鏈表模擬隊列
        queue.add(root);
        while(!queue.isEmpty()){
            TreeNode temp = queue.remove(0);//鏈表頭出隊
            al.add(temp.val);
            if(temp.left!=null){queue.add(temp.left);}
            if(temp.right!=null){queue.add(temp.right);}
        }
        return al;
    }
}
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        ArrayList<Integer> al = new ArrayList<>();
        if(root==null){return al;}
        Deque<TreeNode> queue = new LinkedList<>();//使用雙端隊列
        queue.add(root);
        while(!queue.isEmpty()){
            TreeNode temp = queue.remove();
            al.add(temp.val);
            if(temp.left!=null){queue.add(temp.left);}
            if(temp.right!=null){queue.add(temp.right);}
        }
        return al;
    }
}

雙端隊列:
線性集合,支持兩端的元素插入和移除。Deque是double ended queue的簡稱。
Deque是一個接口interface Deque <E>,子接口爲BlockingDeque <E>
實現類:

  • LinkedList大小可變的鏈表雙端隊列,允許元素爲插入null(慎用,因爲null有時會作爲特殊的返回值)。
  • ArrayDeque大下可變的數組雙端隊列,不允許插入null。
  • ConcurrentLinkedDeque大小可變且線程安全的鏈表雙端隊列,非阻塞,不允許插入null。
  • LinkedBlockingDeque線程安全的雙端隊列,在隊列爲空的情況下,獲取操作將會阻塞,直到有元素添加。

注意:LinkedListArrayDeque是線程不安全的容器。當多個線程同時使用的時候,需要程序員手動同步。

Queue Method Equivalent Deque Method 說明
add(e) addLast(e) 向隊尾插入元素,失敗則拋出異常
offer(e) offerLast(e) 向隊尾插入元素,失敗則返回false
remove() removeFirst() 獲取並刪除隊首元素,失敗則拋出異常
poll() pollFirst() 獲取並刪除隊首元素,失敗則返回null
element() getFirst() 獲取但不刪除隊首元素,失敗則拋出異常
peek() peekFirst() 獲取但不刪除隊首元素,失敗則返回null
Stack Method Equivalent Deque Method 說明
push(e) addFirst(e) 向棧頂插入元素,失敗則拋出異常
offerFirst(e) 向棧頂插入元素,失敗則返回false
pop() removeFirst() 獲取並刪除棧頂元素,失敗則拋出異常
pollFirst() 獲取並刪除棧頂元素,失敗則返回null
peek() peekFirst() 獲取但不刪除棧頂元素,失敗則拋出異常
peekFirst() 獲取但不刪除棧頂元素,失敗則返回null

注意:實現的是棧還是隊列是取決於元素入的時候是何種方式進入,如果是通過add或者addFirst方法進入的話,元素出的時候無論是remove還是pop還是removeFirst都實現的是一個隊列。

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