Binary Tree Zigzag Level Order Traversal(z字形打印二叉树)

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) {
        List<List<Integer>> res=new ArrayList<List<Integer>>();
        if(root==null) return res;
        Stack<TreeNode> s1=new Stack<>();
        Stack<TreeNode> s2=new Stack<>();
        List<Integer> list=new ArrayList<>();
        s1.push(root);
        while(!s1.isEmpty()||!s2.isEmpty()){
            if(!s1.isEmpty()){
                int size=s1.size();
                for(int i=0;i<size;i++){
                    TreeNode node=s1.pop();
                    list.add(node.val);
                    if(node.left!=null) s2.push(node.left);
                    if(node.right!=null) s2.push(node.right);
                }
                res.add(list);
                list=new ArrayList<>();
            }
            if(!s2.isEmpty()){
                int size=s2.size();
                for(int i=0;i<size;i++){
                    TreeNode node=s2.pop();
                    list.add(node.val);
                    if(node.right!=null) s1.push(node.right);
                    if(node.left!=null) s1.push(node.left);
                }
                res.add(list);
                list=new ArrayList<>();
            }
        }
        return res;
    }
}

 

posted on 2018-01-09 11:25  夜的第八章  阅读(225)  评论(0编辑  收藏  举报

导航