剑指Offer(Java实现)把二叉树打印成多行
生活随笔
收集整理的這篇文章主要介紹了
剑指Offer(Java实现)把二叉树打印成多行
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。
解題思路
利用輔助空間鏈表或隊列來存儲節點,每層輸出。
代碼實現
import java.util.ArrayList; 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 {ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {ArrayList<ArrayList<Integer>> res = new ArrayList<>();if (null == pRoot) {return res;}LinkedList<TreeNode> queue = new LinkedList<>();queue.offer(pRoot);ArrayList<Integer> list = new ArrayList<>();int start = 0;int end = 1;while (!queue.isEmpty()) {TreeNode node = queue.pop();start++;list.add(node.val);if (null != node.left) {queue.offer(node.left); // 也可用 queue.add(node.left);}if (null != node.right) {queue.offer(node.right); // 也可用 queue.add(node.right);}if (start == end) {start = 0;end = queue.size();res.add(new ArrayList<>(list));list.clear();}}return res;} }注意
if (start == end) {start = 0;end = queue.size();res.add(new ArrayList<>(list));list.clear(); }start 用于記錄當前節點在其所在層中的位置;end 用于記錄當前節點所在層的節點個數。
當 start == end 時,則說明當前層的節點都以記錄完成,存入ArrayList中;此時,需要將start重新設為0,而且,當前隊列中剩余元素皆為下一層中的節點,故需要將end設置為 queue.size(),并清除list,等待下一次遍歷的節點存儲。
if (null != node.left) {queue.offer(node.left); // 也可用 queue.add(node.left); } if (null != node.right) {queue.offer(node.right); // 也可用 queue.add(node.right); }offer屬于 offer in interface Deque<E>,add 屬于 add in interface Collection<E>。
當隊列為空時候,使用add方法會報錯,而offer方法會返回false。
作為List使用時,一般采用add / get方法來 壓入/獲取對象。
作為Queue使用時,才會采用 offer/poll/take等方法作為鏈表對象時,offer等方法相對來說沒有什么意義這些方法是用于支持隊列應用的。
總的上來說,add() 與 offer() 基本情況可以通用。
總結
以上是生活随笔為你收集整理的剑指Offer(Java实现)把二叉树打印成多行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指Offer(Java实现)按之字形顺
- 下一篇: 生产环境碰到系统CPU飙高和频繁GC,你