14.从上到下打印二叉树I
题目:
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
题解:
- 使用队列queue对二叉树进行层次遍历;
- 初始化queue,使用
匿名内部类
的方式将root存入queue; - 每次输出队列的头部,并将其不为空的左右子树添加至队列尾部,直至队列为空循环结束。
public int[] levelOrder(TreeNode root) {
if (root == null) return new int[0];
List<Integer> list = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<TreeNode>(){{add(root);}};
while (!queue.isEmpty()){
TreeNode remove = queue.remove();
list.add(remove.val);
if (remove.left != null) queue.add(remove.left);
if (remove.right != null) queue.add(remove.right);
}
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++)
res[i] = list.get(i);
return res;
}
15.从上到下打印二叉树 II
题目:
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
题解:
相比于14.从上到下打印二叉树I,在打印每层元素之前,需要记录下当前队列的大小即该层元素的个数。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new LinkedList<>();
if (root == null) return new LinkedList<>();
Queue<TreeNode> queue = new LinkedList<TreeNode>(){{add(root);}};
while (!queue.isEmpty()){
List<Integer> list = new LinkedList<>();
for (int i = queue.size(); i > 0; i--){
TreeNode remove = queue.remove();
list.add(remove.val);
if (remove.left != null) queue.add(remove.left);
if (remove.right != null) queue.add(remove.right);
}
res.add(list);
}
return res;
}
16.从上到下打印二叉树 III
题目:
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
题解:
和15.从上到下打印二叉树 II相比,使用res.size()
纪录奇偶;
-
题解一:偶数层时需要执行Collections.reverse(list);
-
题解二:偶数层时需要执行list.addFirst();
注意:list类型必须为
LinkedList
才有addFirst()方法。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new LinkedList<>();
if (root == null) return new LinkedList<>();
Queue<TreeNode> queue = new LinkedList<TreeNode>(){{add(root);}};
while (!queue.isEmpty()){
List<Integer> list = new LinkedList<>();
for (int i = queue.size(); i > 0; i--){
TreeNode remove = queue.remove();
list.add(remove.val);
if (remove.left != null) queue.add(remove.left);
if (remove.right != null) queue.add(remove.right);
}
if (res.size() % 2 != 0) Collections.reverse(list);
res.add(list);
}
return res;
}
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new LinkedList<>();
if (root == null) return new LinkedList<>();
Queue<TreeNode> queue = new LinkedList<TreeNode>(){{add(root);}};
while (!queue.isEmpty()){
LinkedList<Integer> list = new LinkedList<>();
for (int i = queue.size(); i > 0; i--){
TreeNode remove = queue.remove();
if (res.size() % 2 == 0) list.add(remove.val);
else list.addFirst(remove.val);
if (remove.left != null) queue.add(remove.left);
if (remove.right != null) queue.add(remove.right);
}
res.add(list);
}
return res;
}
期待着一屋两人三餐四季的生活,到那时回头看之前颠沛流离的日子,必然很酷!!