• Binary Tree Zigzag Level Order Traversal


    Binary Tree Zigzag Level Order Traversal

    问题:

    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).

    思路:

      队列层次访问

    我的代码:

    public class Solution {
        public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
            List<List<Integer>> rst = new ArrayList<List<Integer>>();
            if(root == null)    return rst;
            Queue<TreeNode> queue = new LinkedList<TreeNode>();
            queue.offer(root);
            int count = 1;
            while(!queue.isEmpty())
            {
                int size = queue.size();
                List<Integer> list = new ArrayList<Integer>();
                for(int i = 0; i < size; i++)
                {
                    TreeNode node = queue.poll();
                    if(node.left != null)   queue.offer(node.left);
                    if(node.right != null)  queue.offer(node.right);
                    list.add(node.val);
                }
                if(count%2 == 1)
                {
                    rst.add(list);
                }
                else
                {
                    Collections.reverse(list);
                    rst.add(list);
                }
                count++;
            }
            return rst;
        }
    }
    View Code

    他人代码:

    public class Solution {
        public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
            ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
    
            if (root == null) {
                return result;
            }
    
            Stack<TreeNode> currLevel = new Stack<TreeNode>();
            Stack<TreeNode> nextLevel = new Stack<TreeNode>();
            Stack<TreeNode> tmp;
            
            currLevel.push(root);
            boolean normalOrder = true;
    
            while (!currLevel.isEmpty()) {
                ArrayList<Integer> currLevelResult = new ArrayList<Integer>();
    
                while (!currLevel.isEmpty()) {
                    TreeNode node = currLevel.pop();
                    currLevelResult.add(node.val);
    
                    if (normalOrder) {
                        if (node.left != null) {
                            nextLevel.push(node.left);
                        }
                        if (node.right != null) {
                            nextLevel.push(node.right);
                        }
                    } else {
                        if (node.right != null) {
                            nextLevel.push(node.right);
                        }
                        if (node.left != null) {
                            nextLevel.push(node.left);
                        }
                    }
                }
    
                result.add(currLevelResult);
                tmp = currLevel;
                currLevel = nextLevel;
                nextLevel = tmp;
                normalOrder = !normalOrder;
            }
    
            return result;
    
        }
    }
    View Code

    学习之处:

    • 虽然使用队列也能实现该问题,但是仔细想想,如果这一层的最右节点是这层的最后一个元素,那么它的right节点是下一层的最后一个访问的,如果这一层的最左节点是该层访问的最后一个元素,那么该元素的Left将是下一层访问的节点,故由此分析,使用Stack比queue要更加合理,而且如此一来,也能节约掉Queue方法下面的链表翻转的时间。
  • 相关阅读:
    Partition HDU
    FFT版题 [51 Nod 1028] 大数乘法
    [51Nod 1220]
    [bzoj 4176] Lucas的数论 (杜教筛 + 莫比乌斯反演)
    [51Nod 1222]
    [51Nod 1227] 平均最小公倍数 (杜教筛)
    算法-05-二分查找第一个出现的数 美团一面
    Hbase-00-MAC 安装Hbase 单机模式
    算法-04-用两个栈实现队列
    算法-03-Java 实现阻塞队列 字节三面算法题
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4337942.html
Copyright © 2020-2023  润新知