Binary Tree Zigzag Level Order Traversal:锯齿打印二叉树

Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

For example:
Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its zigzag level order traversal as:

[
  [3],
  [20,9],
  [15,7]
]

思路:还是基于层次遍历,记录所在层次,判断是正向打印还是逆向打印。

/**
 * 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) {
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        ArrayList<TreeNode> temp = new ArrayList<TreeNode>();
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        q.add(root);
        boolean towards = true;//true:l2r,false:r2l
        while(!q.isEmpty()){
            List<Integer> result = new ArrayList<Integer>();
            while(!q.isEmpty()){
                TreeNode n = q.poll();
                if( n == null ) continue;
                result.add(n.val);                    
                temp.add(n.left);
                temp.add(n.right);                       
            }
            if(towards){
               if(result.size() > 0)  ans.add(result);
            }else{
               if(result.size() > 0){
                    Collections.reverse(result);
                    ans.add(result);
               }  
            }    
            towards = !towards;
            if(temp.size() > 0)  q.addAll(temp);
            temp.clear();
        }
        return ans;
    }
}

更简略写法:

/**
 * 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>> sol = new ArrayList<>();
        travel(root, sol, 0);
        return sol;
    }
    
    private void travel(TreeNode curr, List<List<Integer>> sol, int level)
    {
        if(curr == null) return;
        
        if(sol.size() <= level) sol.add(new LinkedList<>());
        
        if(level % 2 == 0) sol.get(level).add(curr.val);
        else sol.get(level).add(0, curr.val);
        
        travel(curr.left, sol, level + 1);
        travel(curr.right, sol, level + 1);
    }
}
现在得加大题量了,所以博客就简记一下思路,不详细说了~




猜你喜欢

转载自blog.csdn.net/u013300579/article/details/80524311
今日推荐