• 【LeetCode】103# 二叉树的锯齿形层次遍历


    题目描述

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

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

        3
       / 
      9  20
        /  
       15   7
    

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

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

    解题思路

    考虑到题目需要用折线得方式遍历,就是说在遍历的过程中需要有反向操作,可以联想到使用栈来实现。

    双栈法

    1. 建立两个栈stack1stack2
    2. 把二叉树的根节点pushstack1
    3. 使用一个while循环,pop当前节点的子结点,然后push进另一个栈,这样每处理一个栈,就在最终结果ans里面加一个列表(当前深度的节点)

    源代码

    public List<List<Integer>> zigzagLevelOrder (TreeNode root) {
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        if (root== null) return ans;
        Stack<TreeNode> stack1 = new Stack<>();
        Stack<TreeNode> stack2 = new Stack<>();
        TreeNode cur = root;
        stack1.push(cur);
        while (!stack1.isEmpty() || !stack2.isEmpty()) {
            List<Integer> temp = new ArrayList<>();
            while (!stack1.isEmpty()) {
                cur = stack1.pop();
                temp.add(cur.val);
                if (cur.left !=null) stack2.push(cur.left);
                if (cur.right !=null) stack2.push(cur.right);
            }
            ans.add(temp);
            temp = new ArrayList<>();
            while (!stack2.isEmpty()) {
                cur = stack2.pop();
                temp.add(cur.val);
                if (cur.right !=null) stack1.push(cur.right);
                if (cur.left !=null) stack1.push(cur.left);
            }
            if (!temp.isEmpty()) {
                ans.add(temp);
            }
        }
        return ans;
    }
    

    心得体会

    一开始只用了一个栈和一个列表来实现,怎么也调不通,后来参考了讨论区的解答,使用双栈,豁然开朗。

  • 相关阅读:
    HTML 笔记
    JavaScript 学习笔记
    对近期的一些总结
    【 Java 】手速手速~
    【 Java 】 简易交通灯
    【 Art 】小心心~
    scala 标识符案例
    scala 基础类型
    scala 类、字段、方法
    scala 列表
  • 原文地址:https://www.cnblogs.com/yuzhenzero/p/10254629.html
Copyright © 2020-2023  润新知