zoukankan      html  css  js  c++  java
  • 103. 二叉树的锯齿形层次遍历

     思路:

    (1)假设根节点在第零层,这样的话,偶数层从左往右遍历,奇数层从右往左遍历。

    (2)假设使用队列,而且9下面有子节点

     第0层没问题,

    第1层要想实现从右往左遍历,得先入队20,再入队9,

    但是第2层又要从左往右遍历了,但是第一行先出队的确是20,这就不行了,得先入队9的节点才行,这样第二层才能实现从左往右遍历,综上所述,需要栈

    (3)首先设置偶数层的栈even,和奇数层的栈odd

    (4)之后,还以上方的树为例,3入栈偶数层栈,在循环里面,偶数层出栈,之后9,20顺序入奇数层的栈。

    (5)到了奇数层,出栈,出的是20(先入后出)把20这个数加入当前层的结果里面,然后把7,15再次入even栈。之后奇数层出栈9

    (6)又到了偶数层,出栈,这次是15,然后把15的左,右子树相继入奇数层的栈。。。实现了偶数层从左往右遍历,奇数层从右往左遍历

    /**
     * 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<>();//假设根节点在第0层,偶数层从左向右
            Stack<TreeNode> evenLevel = new Stack<>();//记录偶数层的节点栈
    		Stack<TreeNode> oddLevel = new Stack<>();//记录奇数层的节点栈
            if(root==null) return res;
            evenLevel.push(root);
            for(int i=0;!evenLevel.isEmpty()||!oddLevel.isEmpty();i++)
            {
                res.add(new ArrayList<Integer>());
                if(i%2==0)//如果是偶数层,下一层奇数层该从右往左遍历了,因为栈是先入后出,所以应该先入栈每个节点的左子节点
                {
                    while(!evenLevel.isEmpty())
                    {
                        TreeNode t=evenLevel.pop();
                        res.get(i).add(t.val);
                        if(t.left!=null) oddLevel.push(t.left);
                        if(t.right!=null) oddLevel.push(t.right);
    
    
                    }
                }
                else
                {
                    while(!oddLevel.isEmpty())//这是奇数层,下一层是偶数层,所以说要先入栈右子树
                    {
                        TreeNode t=oddLevel.pop();
                        res.get(i).add(t.val);
                         if(t.right!=null) evenLevel.push(t.right);
                        if(t.left!=null) evenLevel.push(t.left);//这里判断条件写反了,卡了好久
    
                    }
                }
    
            }
            return res;
    
        }
    }
    

      

  • 相关阅读:
    洛谷 P1908 逆序对(树状数组解法)
    洛谷 P1908 逆序对(归并排序解法)
    洛谷 P3368 【模板】树状数组 2(区间修改点查询)
    POJ 2833 The Average(优先队列)
    POJ 2255 Tree Recoveryw(二叉树)
    洛谷 P1540 机器翻译(队列)
    POJ 1686 Lazy Math Instructor(栈)
    队列中取最大值操作
    相邻元素差的绝对值都是1,在这样的数组中找目标元素
    双栈队列实现快速获取队列最大值最小值
  • 原文地址:https://www.cnblogs.com/lzh1043060917/p/12836452.html
Copyright © 2011-2022 走看看