《劍指offer》——把二叉樹列印成多行
阿新 • • 發佈:2019-01-27
T:
題目描述
從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。
解法都在程式碼註釋當中了。
我的code:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
/**
* T: 把二叉樹列印成多行
*
* 題目描述
* 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。
*
* date: 2015.12.1 15:54
* @author SSS
*
*/
public class Solution {
/**
* 用佇列存放,只不過在往佇列中新增元素是,記錄新增的個數。
* 同時記錄上層總共有多少個節點,當前已經遍歷了幾個節點, 下一層已經新增進去了幾個節點
* @param pRoot
* @return
*/
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> resultsList = new ArrayList<ArrayList<Integer>>();
if (pRoot == null) {
return resultsList;
}
Queue<TreeNode> newQueue = new LinkedList<TreeNode>();
newQueue.add(pRoot);
int layerCount = 1; // 當前層的節點的總個數
int upCount = 0; // 當前已經便利過的本層的節點的個數
int downCount = 0; // 下一層的節點個數統計
ArrayList<Integer> nodeList = new ArrayList<Integer>();
while (!newQueue.isEmpty()) {
TreeNode tempNode = newQueue.poll();
nodeList.add(tempNode.val);
upCount ++;
// 若左右節點不為空,則將左右節點都新增進去
if (tempNode.left != null) {
newQueue.add(tempNode.left);
downCount ++;
}
if (tempNode.right != null) {
newQueue.add(tempNode.right);
downCount ++;
}
// 看本層的節點是否已經遍歷完
if (upCount == layerCount) {
ArrayList<Integer> tarList = new ArrayList<Integer>();
for (int i = 0; i < nodeList.size(); i++) {
tarList.add(nodeList.get(i));
}
resultsList.add(tarList);
//清空nodeList陣列
for (int i = 0; i < layerCount; i++) {
nodeList.remove(0);
}
// 重置為零
upCount = 0;
// 因為要開始遍歷下一層,要設定下一層的總個數給layerCount
layerCount = downCount;
// 開始遍歷下一層時,就要統計下下層的個數大小
downCount = 0;
}
}
return resultsList;
}
}