题目:二叉树的锯齿形层次遍历


给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行)

您在真实的面试中是否遇到过这个题?

Yes


     


样例

给出一棵二叉树 {3,9,20,#,#,15,7},
    3
   / \
  9  20
    /  \
   15   7

返回其锯齿形的层次遍历为:
[
  [3],
  [20,9],
  [15,7]
]
标签 Expand   



解题思路:
与之前的树的层次遍历类似用2个队列去分别保存该层和下一层的节点,遍历第一个队列时弹出后,将弹出的节点的左右节点放入第2个队列。锯齿形只需要将符合n%2==0翻转即可。
/**
* Definition of TreeNode:
* public class TreeNode {
*     public int val;
*     public TreeNode left, right;
*     public TreeNode(int val) {
*         this.val = val;
*         this.left = this.right = null;
*     }
* }
*/


public class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: A list of lists of integer include
     *          the zigzag level order traversal of its nodes' values
     */
    public ArrayList> zigzagLevelOrder(TreeNode root) {
        // write your code here
         ArrayList> res  = new ArrayList<>();
          if(null==root) return res;
          Queue fQ = new LinkedList<>();
          fQ.add(root);
          int countswap = 1;
          while(fQ!=null&&fQ.size()>0){
              Queue sQ = new LinkedList<>();
             ArrayList depthRoot  = new ArrayList<>();
              while(fQ!=null&&fQ.size()>0){
                   TreeNode  cur = fQ.poll();
                   depthRoot.add(cur.val);
                   if(cur.left!=null){
                        sQ.add(cur.left);
                   }
                   if(cur.right!=null){
                        sQ.add(cur.right);
                   }
              }
              if(countswap%2==0){
                   depthRoot = reverseT(depthRoot);
              }
             res.add(depthRoot);
              countswap++;
              fQ = sQ;
          }         
          return res;        
     }
     public ArrayList  reverseT(ArrayList res){
         ArrayList  reres = new ArrayList<>();
         for(int i=res.size()-1;i>=0;i--){
              T tmp = res.get(i);
              reres.add(tmp);
         }
         return reres;
    }
}

你可能感兴趣的:(题目:二叉树的锯齿形层次遍历)