[劍指offer]20.從上到下打印二叉樹 II

題目連接:戳這裏
題目描述:
4.png
解題思路:
來自leetcode大佬Krahets題解:java

  • I. 按層打印:題目要求的二叉樹的從上至下打印(即按層打印),又稱爲二叉樹的廣度優先搜索(BFS)。BFS 一般藉助隊列的先入先出特性來實現。
  • II. 每層打印到一行:若將二叉樹從上至下分爲多層,則經過訪問某層全部節點的 左右子節點,可統計出下一層的全部節點。根據此特性,可在打印本層所有節點時,將下一層所有節點加入隊列,以此類推,便可分爲多行打印。
算法流程:
  1. 特例處理:當樹的根節點爲空,則直接返回空列表[]
  2. 初始化:打印結果列表res = [],包含根節點的隊列queue = [root]
  3. BFS 循環:當隊列queue爲空時跳出;node

    1. 新建一個臨時列表tmp,用於存儲當前層打印結果;
    2. 當前層打印循環:循環次數爲隊列queue長度(隊列中元素爲全部當前層節點);算法

      1. 出隊:隊首元素出隊,記爲node
      2. 打印:node.val添加至列表tmp尾部;
      3. 添加子節點:node的左(右)子節點不爲空,則將左(右)子節點加入隊列queue
    3. 將當前層結果tmp添加入res
  4. 返回值:返回打印結果列表res便可。

java代碼:spa

/**
 * 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>> levelOrder(TreeNode root) {
        Queue<TreeNode> que=new LinkedList<>();
        List<List<Integer>> res=new ArrayList<>();
        if(root!=null) que.add(root);
        while (!que.isEmpty()){
            List<Integer> tmp=new ArrayList<>();
            for(int i=que.size();i>0;i--){
                TreeNode node = que.poll();
                tmp.add(node.val);
                if(node.left!=null) que.add(node.left);
                if(node.right!=null) que.add(node.right);
            }
            res.add(tmp);
        }
        return res;
    }
}
相關文章
相關標籤/搜索