zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    双屏显示器
    Cheat Engine Tutorial v3翻译Cheat Engine 6.1 tutorial(3)
    [转]VC6创建UNICODE版Windows程序
    fread
    [转]回调函数在MFC中的使用
    [转]C++ 虚函数表解析
    [转]C/C++返回内部静态成员的陷阱
    [转]EVC 中 include 的错误
    【rgw压缩】
    【ceph | 运维】rgw重置
  • 原文地址:https://www.cnblogs.com/xiaolovewei/p/8250573.html
Copyright © 2011-2022 走看看