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;
        }
    }
  • 相关阅读:
    CLR 对比 JVM
    unity drawcall测试
    UGUI 分页渐变居中效果
    几个ADB常用命令
    jQuery分步步骤
    jquery toast插件
    jQuery数字滚动(模拟网站人气、访问量递增)原创
    jQuery实用工具集
    scrollReveal.js – 页面滚动显示动画JS
    jquery轻量级数字动画插件jquery.countup.js
  • 原文地址:https://www.cnblogs.com/xiaolovewei/p/8250573.html
Copyright © 2011-2022 走看看