103.二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
广度优先遍历,用到队列,不同的层遍历顺序不同,所以要用双向链表。
广度优先遍历不同的层在队列中用Null作为分隔符隔开。队列为空queue.size()==0时结束。
双向链表用LinkedList,与二维列表的类型一致。
/** * 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>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result=new LinkedList<>();//结果链表
LinkedList<Integer> level_list=new LinkedList<>();//每一行链表
Queue<TreeNode> queue=new LinkedList<>();//bfs队列
boolean left=false; //先进bfs队列,以null隔开每一层
if(root==null)
return result;
queue.add(root);
queue.add(null);
//将队头左右孩子压入bfs队列
//出BFS队列,进每一行链表
//一层结束,进结果链表
while(queue.size()>0)
{
TreeNode temp=queue.poll();
if(temp!=null)
{
if(temp.left!=null)
queue.add(temp.left);
if(temp.right!=null)
queue.add(temp.right);
if(left==true)
{
level_list.addFirst(temp.val);//列表添加值就行
}
else level_list.addLast(temp.val);
}
else//遍历完一层
{
result.add(level_list);
if (queue.size() > 0)//队列是否为空,是否还有下一层
queue.add(null);//有子节点,在子节点后面添加分隔符。后面添加的是子节点的子节点
left=!left;//改变遍历顺序
level_list=new LinkedList<>();//在堆中分配新的内存
} }
return result; }}