按之字形順序列印二叉樹
阿新 • • 發佈:2018-12-10
題目
請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。
思路
思路主要就是如何把層序遍歷序列按層分開來,跟前面的直接列印二叉樹每層思路一樣,只是現在要判斷奇數層和偶數層,然後反轉對應的ArrayList即可!
public class Solution {
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
/**
* 陣列轉二叉樹
*/
private TreeNode createBinaryTreeByArray(int[] array, int index) {
TreeNode tn = null;
if (index < array.length) {
int value = array[index];
tn = new TreeNode(value);
tn.left = createBinaryTreeByArray(array, 2 * index + 1);
tn.right = createBinaryTreeByArray(array, 2 * index + 2);
return tn;
}
return tn;
}
/**
* 之字形列印二叉樹
* 用reserve反轉,時間複雜度高
*/
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
//arrayLists儲存結果
ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>();
if (pRoot == null) {
return arrayLists;
}
ArrayList<Integer> arrayList = new ArrayList<>();
//使用佇列,先進先出
Queue<TreeNode> queue = new LinkedList<>();
queue.add(pRoot);
int start = 0;
int end = 1;
boolean leftToRight = true;
while (!queue.isEmpty()) {
TreeNode temp = queue.remove();
//新增到本行的arrayList
arrayList.add(temp.val);
start++;
//每列印一個節點,就把此節點的下一層的左右節點加入佇列,並記錄下一層要列印的個數
if (temp.left != null) {
queue.add(temp.left);
}
if (temp.right != null) {
queue.add(temp.right);
}
if (start == end) {
start = 0;
end = queue.size();
if (leftToRight) {
arrayLists.add(arrayList);
} else {
arrayLists.add(reverse(arrayList));
}
//反轉過一次下次就不用反轉
leftToRight = !leftToRight;
arrayList = new ArrayList<>();
}
}
return arrayLists;
}
/**
* 反轉
*/
private ArrayList<Integer> reverse(ArrayList<Integer> arrayList) {
ArrayList<Integer> arrayList1 = new ArrayList<>();
for (int i = arrayList.size() - 1; i >= 0; i--) {
arrayList1.add(arrayList.remove(i));
}
return arrayList1;
}
}