LeetCode Java刷题笔记—103. 二叉树的锯齿形层序遍历

103. 二叉树的锯齿形层序遍历

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

中等难度,这道题实际上就是102. 二叉树的层序遍历的变种,先学会了102,那么这道题就简单了。

既然要实现遍历顺序的交叉,那么我们使用一个boolean的变量作为标志位即可,第一次为true,遍历后改为false,然后再改为true……。true表示从左到右遍历,false表示从右向左遍历。

对于每一层的List,采用LinkedList结构,这样就能通过标志位结合add和addFirst方法实现不同顺序的遍历的效果。

public List<List<Integer>> zigzagLevelOrder( TreeNode root ){

   ArrayList<List<Integer>> lists = new ArrayList<>();
   if( root == null ){
      return lists;
   }
   LinkedList<TreeNode> nodes = new LinkedList();
   nodes.add( root );
   boolean flag = true;
   while( !nodes.isEmpty() ){
      int size = nodes.size();
      //采用LinkedList而不是ArrayList
      LinkedList<Integer> nums = new LinkedList();
      for( int i = 0; i < size; i++ ){
         TreeNode node = nodes.removeFirst();
         //通过标志位判断,采用达到交替顺序遍历的效果
         if( flag ){
            nums.add( node.val );
         }
         else{
            //采用addFirst达到从右到左遍历的效果
            nums.addFirst( node.val );
         }
         if( node.left != null ){
            nodes.add( node.left );
         }
         if( node.right != null ){
            nodes.add( node.right );
         }
      }
      lists.add( nums );
      flag = !flag;
   }
   return lists;
}

你可能感兴趣的:(leetcode,java,算法,二叉树的锯齿形层序遍历)