一、从上到下打印二叉树
1、题目描述: 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
2、示例如下:
3、代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int[] levelOrder(TreeNode root) {
if(root==null)
return new int[0];
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root); //把根节点放到queue中,也可以用offer()添加
ArrayList<Integer> ans=new ArrayList<>();
while(!queue.isEmpty()){
TreeNode node=queue.poll(); //poll移除并返回队列头部的元素
ans.add(node.val);
if(node.left!=null)
queue.add(node.left);
if(node.right!=null)
queue.add(node.right);
}
int[] res=new int[ans.size()];
for(int i=0;i<ans.size();i++) //将集合转换为数组
res[i]=ans.get(i);
return res;
}
}
二、从上到下打印二叉树 II
1、题目描述: 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
2、示例如下:
3、代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans=new ArrayList<List<Integer>>(); //最后的结果,注意层次
if(root==null)
return ans;
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
//方法一 嵌套for循环
while(!queue.isEmpty()){
List<Integer> temp=new ArrayList<>();
int currentLevelSize=queue.size(); //保存当前层次的节点数量
for(int i=0;i<currentLevelSize;i++){ //根据当前层次的节点数量确定遍历几个节点
TreeNode node=queue.poll();
temp.add(node.val);
if(node.left!=null)
queue.add(node.left);
if(node.right!=null)
queue.add(node.right);
}
ans.add(temp);
}
//方法二 用指针标记最后一个节点
// List<Integer> list = new ArrayList<>();
// TreeNode lastNode = root; //第一层最后一个节点就是根节点
// while(!queue.isEmpty()){
// TreeNode cur = queue.poll();
// list.add(cur.val);
// if(cur.left != null){
// queue.add(cur.left);
// }
// if(cur.right != null){
// queue.add(cur.right);
// }
// //已经遍历完一层的最后一个节点
// if(lastNode == cur){
// ans.add(list); //存储每一层的遍历
// lastNode = queue.peekLast(); //其实就是标记每层二叉树中最右的节点
// list = new ArrayList<>();
// }
// }
return ans;
}
}
三、从上到下打印二叉树 III
1、题目描绘: 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
2、示例如下:
3、代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans=new ArrayList<List<Integer>>();
if(root==null)
return ans;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
boolean isOrderLeft=true;
while(!queue.isEmpty()){
Deque<Integer> levelList=new LinkedList<Integer>(); //用双端队列保存每层输出的元素
int currentQueueSize=queue.size();
for(int i=0;i<currentQueueSize;i++){
TreeNode node=queue.poll();
if(isOrderLeft){
levelList.offerLast(node.val); //如果是从左到右,就从尾端开始加
}else{
levelList.offerFirst(node.val); //如果是从右到左,就从首端开始加
}
if(node.left!=null)
queue.offer(node.left);
if(node.right!=null)
queue.offer(node.right);
}
ans.add(new LinkedList<Integer>(levelList)); //必须转换对象,不然不兼容
isOrderLeft=!isOrderLeft; //更换顺序
}
return ans;
}
}