题目:
- 层序遍历(宽度遍历)
- 从上到下按行打印
- 之字形打印二叉树
关键点:
- 二叉树的宽度遍历
- 层间换行
代码实现:
public static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int value) {
this.val = value;
}
}
//层序遍历
public static ArrayList<Integer> traversalByLevel(TreeNode pRoot) {
ArrayList<Integer> a = new ArrayList<Integer>();
if(pRoot == null) return a;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(pRoot);
while(!queue.isEmpty()) {
TreeNode temp = queue.poll();
a.add(temp.val);
if(temp.left != null) queue.offer(temp.left);
if(temp.right != null) queue.offer(temp.right);
}
return a;
}
//按层打印
public static ArrayList<ArrayList<Integer>> printByLevel(TreeNode root) {
ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>();
if(root == null) return a;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()) {
int count= 0;
ArrayList<Integer> arr= new ArrayList<>();
int curSize = queue.size();
while(count < curSize) {
TreeNode temp = queue.poll();
arr.add(temp.val);
if(temp.left != null) queue.offer(temp.left);
if(temp.right != null) queue.offer(temp.right);
count++;
}
a.add(arr);
}
return a;
}
//按之字形打印
public static ArrayList<ArrayList<Integer>> printByZigZagLevel(TreeNode root) {
ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>();
if(root == null) return a;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
boolean is = true;
while(!queue.isEmpty()) {
int count= 0;
ArrayList<Integer> arr= new ArrayList<>();
int curSize = queue.size();
while(count < curSize) {
TreeNode temp = queue.poll();
arr.add(temp.val);
if(temp.left != null) queue.offer(temp.left);
if(temp.right != null) queue.offer(temp.right);
count++;
}
if(is == true) {
a.add(arr);
}else {
a.add(reverse(arr));
}
is = !is;
}
return a;
}
public static ArrayList<Integer> reverse(ArrayList<Integer> arr) {
if(arr == null) return null;
ArrayList<Integer> r = new ArrayList<Integer>();
int j = 0;
for(int i = arr.size() - 1; i >= 0; i--) {
r.add(j++, arr.get(i));
}
return r;
}