层次遍历二叉树:
public void levelOrderTraversal (Node root) {
Queue<Node> queue = new LinkedList<Node>();
queue.offer(root);
while (!queue.isEmpty()) {
root = queue.poll();
System.out.print(root.value);
if (root.left != null) {
queue.offer(root.left);
}
if (root.right != null) {
queue.offer(root.right);
}
}
}
层次打印二叉树
示例1
输入:
{1,2,3,#,#,4,5}
返回值:
[[1],[2,3],[4,5]]
示例2
输入:
{8,6,10,5,7,9,11}
返回值:
[[8],[6,10],[5,7,9,11]]
其实就是BFS搜索,需要加一个for循环:
ArrayList<ArrayList<Integer>> Print(Node pRoot) {
ArrayList<ArrayList<Integer>> thelist = new ArrayList<ArrayList<Integer>>();
if(pRoot==null)return thelist; //这里要求返回thelist而不是null
Queue<Node> queue = new LinkedList<Node>();
queue.offer(pRoot);
while(!queue.isEmpty()){
ArrayList<Integer> list = new ArrayList<Integer>();
int size = queue.size();
for(int i=0;i<size;i++){
pRoot = queue.poll();
list.add(pRoot.value);
if (pRoot.left != null) {
queue.offer(pRoot.left);
}
if (pRoot.right != null) {
queue.offer(pRoot.right);
}
}
thelist.add(list);
}
return thelist;
}
之字型打印:
在BFS层次打印的基础上,维护一个深度变量dep。每次将子数组list添加到总数组all中的时候,深度就加1。
- 当dep为奇数的时候,使用ArrayList.add(obj)来在尾部追加
- 当dep为偶数的时候,使用ArrayList.add(0,obj)来在头部追加
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> all = new ArrayList<ArrayList<Integer>>();
if(pRoot==null)return all;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(pRoot);
int dep=1;
while(!queue.isEmpty()){
ArrayList<Integer> list = new ArrayList<Integer>();
int size = queue.size();
for(int i=0;i<size;i++){
pRoot = queue.poll();
// 不同的添加方式
if(dep%2==1) list.add(pRoot.val);
else if (dep%2==0) list.add(0, pRoot.val);
if (pRoot.left != null) {
queue.offer(pRoot.left);
}
if (pRoot.right != null) {
queue.offer(pRoot.right);
}
}
all.add(list);
dep++;
}
return all;
}
}