leetcode103-二叉树的锯齿形层次遍历

原题

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回锯齿形层次遍历如下:

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

解法

思想

用两个栈来交替存储某一层和下一层的节点:

读取第一个栈的时候,从左向右的读取节点,将它们的子节点从左向右入第二个栈,能使读取第二个栈的时候是以从右向左的顺序出栈的。

读取第二个栈的时候,从右向左的读取节点,将它们的子节点从右向左入第一个栈,能使读取第一个栈的时候是以从左向右的顺序出栈的。

这样交替使用两个栈,可以实现两层之间的顺序反转。

代码

class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<>();
        Stack<TreeNode> first = new Stack<>();
        Stack<TreeNode> second = new Stack<>();
        List<Integer> cur;
        if(root == null) return ans;
        first.push(root);
        while(!first.isEmpty()||!second.isEmpty()){
            //当前层的节点按从左向右的顺序依次出栈,子节点按从左向右的顺序入second栈,实现顺序逆转
            cur = new ArrayList<>();
            while(!first.isEmpty()){
                TreeNode node = first.pop();
                cur.add(node.val);
                if(node.left!=null) second.push(node.left);
                if(node.right!=null) second.push(node.right);
            }
            ans.add(cur);
            //下一层的节点按从右向左的顺序依次出栈,子节点按从右向左的顺序入first栈,实现顺序逆转
            if(second.isEmpty()) break;
            cur = new ArrayList<>();
            while(!second.isEmpty()){
                TreeNode node = second.pop();
                cur.add(node.val);
                if(node.right!=null) first.push(node.right);
                if(node.left!=null) first.push(node.left);
            }
            ans.add(cur);
        }
        return ans;
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode103-%e4%ba%8c%e5%8f%89%e6%a0%91%e7%9a%84%e9%94%af%e9%bd%bf%e5%bd%a2%e5%b1%82%e6%ac%a1%e9%81%8d%e5%8e%86/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年1月25日
下一篇 2020年1月25日

相关推荐

  • leetcode81-搜索旋转排序数组II

    原题 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定…

    算法 2020年5月30日
    060
  • leetcode1371-每个元音包含偶数次的最长子字符串

    原题 给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 'a','e','i','o','u' ,在子字符串中都恰好出现了偶数次。 示例 1: 输入…

    算法 2020年5月20日
    01560
  • leetcode496-下一个更大元素I

    原题 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。 nums…

    算法 2020年1月31日
    0400
  • leetcode71-简化路径

    原题 以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..…

    算法 2020年1月23日
    090
  • leetcode110-平衡二叉树

    原题 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1:  给定二叉树 […

    算法 2020年1月17日
    0170
  • leetcode682-棒球比赛

    原题 你现在是棒球比赛记录员。给定一个字符串列表,每个字符串可以是以下四种类型之一:1. 整数(一轮的得分):直接表示您在本轮中获得的积分数。2. "+"(一轮的得…

    算法 2020年2月3日
    0210
  • 剑指offer57-和为s的连续正数序列

    原题(来源Leetcode) 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 序列内的数字由小到大排列,不同序列按照首个数字从小到…

    算法 2020年3月6日
    050
  • leetcode1114-按序打印

    原题 我们提供了一个类: public class Foo {   public void one() { print("one"); }   public void two() …

    算法 2020年2月1日
    0140
  • leetcode347-前K个高频元素

    原题 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例2: 输入: n…

    算法 2019年12月28日
    0150
  • leetcode12-整数转罗马数字

    原题 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2…

    算法 2020年2月29日
    070

发表回复

登录后才能评论