1.LeetCode 102 题:按层次输出二叉树的节点
思路:按层次输出二叉树的节点则首先考虑使用广度优先遍历
(1)提出问题:如何保证输出的集合为当前层的值
解决:使用队列,队列的长度即为当前层的长度
(2)提出问题:怎么保证依次往下遍历
解决:基于前序遍历,先加入队列中Poll出的当前节点的值,然后再往左右节点进行遍历,并且将左右节点接入到队列中
代码实现:
public static List<List<Integer>> levelOrder(TreeNode root){
//结果集
List<List<Integer>> res = new LinkedList<>();
if(root==null) return res;
//创建队列存当前层的节点
Queue<TreeNode> queue = new LinkedList<>();
//首先加入头节点
queue.offer(root);
while(!queue.isEmpty()){
//当前层的值
List<Integer> path = new ArrayList<>();
//队列的大小,代表当前层的节点数,一定要指定,要不然会导致,串层
int size = queue.size();
//判断条件从1开始,且必须等于size大小
for(int i=1;i<=size;i++){
//poll节点加入到当前层的集合中
TreeNode node = queue.poll();
path.add(node.val);
//假设有左右节点则加入到队列中
if(node.left!=null) queue.add(node.left);
if(node.right!=null) queue.add(node.right);
}
res.add(path);
}
return res;
}
2.二叉树的锯齿形层序遍历:leetCode 103题
思路:对应上面的层序遍历,依旧使用广度优先遍历,因为涉及到转向的操作,所以可以使用栈和一个判断符号来控制添加的位置
(1)提出问题:第一层由左向右,第二层是由右向左,依次往下,如何控制转向?
解决:通过栈Deque,假设从左往右则每次插入都是尾部插入,进行一个压栈,最后输出的即为正序
假设从右往左则每次插入从头部插入,进行一个压栈,最后输出为逆序
代码实现:
public static List<List<Integer>> levelOrder(TreeNode root){
List<List<Integer>> res = new LinkedList<>();
if(root==null) return res;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
//添加的控制输出顺序的判断符号
boolean isOrderLeft=true;
while(!queue.isEmpty()){
//用栈来控制添加的数值
Deque<Integer> path = new LinkedList<>();
int size = queue.size();
for(int i=1;i<=size;i++){
TreeNode node = queue.poll();
if(isOrderLeft){
path.offerLast(node.val);
}else {
path.offerFirst(node.val);
}
if(node.left!=null) queue.add(node.left);
if(node.right!=null) queue.add(node.right);
}
//注意一层输出完之后需要进行变向
isOrderLeft=!isOrderLeft;
//因为使用栈存储,所以最终返回的结果需要由List处理
res.add(new ArrayList<>(path));
}
return res;
}