zoukankan      html  css  js  c++  java
  • Binary Tree Zigzag Level Order Traversal

    [解题思路]

    二叉树的层序遍历通过使用queue来实现,

    上网搜索了下,发现该题可以使用栈来解决,通过分析执行结果确实是后进先出

    这里通过定义leftToRight来表示是从左到右还是从右到左

    从左到右:先加left后加right

    从右到左:先加right后加left

    orderlevel traversal 遍历最后每行添加到result前 判断是leftToRight 还是Right to Left

    /**
     * Definition for binary tree
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
            ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
            
            if(root == null)
                return result;
                
            LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
            queue.add(root);
            boolean leftToRight = true;
            int nextLevelCount = 1;
            
            while(!queue.isEmpty()){
                int curLevel = nextLevelCount;
                nextLevelCount = 0;
                ArrayList<Integer> lvl = new ArrayList<Integer>();
                
                for(int i = 0; i < curLevel; i++){
                    TreeNode tmp = queue.poll();
                    lvl.add(tmp.val);
                    if(tmp.left != null){
                        queue.add(tmp.left);
                        nextLevelCount++;
                    }
                    if(tmp.right != null){
                        queue.add(tmp.right);
                        nextLevelCount++;
                    }
                }
                if(leftToRight){
                    result.add(lvl);
                    leftToRight = !leftToRight;
                }else{
                    ArrayList<Integer> reverseLvl = new ArrayList<Integer>();
                    for(int i = lvl.size()-1; i >= 0; i--){
                        reverseLvl.add(lvl.get(i));
                    }
                    result.add(reverseLvl);
                    leftToRight = !leftToRight;
                }
                
            }
            return result;
        }
    }
    /**
     * Definition for binary tree
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    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> curLvl = new Stack<TreeNode>();
            Stack<TreeNode> nextLvl = new Stack<TreeNode>();
            boolean leftToRight = true;
            curLvl.push(root);
            ArrayList<Integer> output = new ArrayList<Integer>();
            while(!curLvl.empty()){
                TreeNode curNode = curLvl.pop();
                output.add(curNode.val);
                if(leftToRight){
                    if(curNode.left != null){
                        nextLvl.add(curNode.left);
                    }
                    if(curNode.right != null){
                        nextLvl.add(curNode.right);
                    }
                } else{
                    if(curNode.right != null){
                        nextLvl.add(curNode.right);
                    }
                    if(curNode.left != null){
                        nextLvl.add(curNode.left);
                    }
                }
                if(curLvl.empty()){
                    result.add(output);
                    output = new ArrayList<Integer>();
                    leftToRight = !leftToRight;
                    curLvl.addAll(nextLvl);
                    nextLvl.clear();
                }
            }
            return result;
        }
    }
  • 相关阅读:
    VC6.0 error LNK2001: unresolved external symbol _main解决办法
    C++中数字与字符串之间的转换(使用CString.Format或者sprintf)
    C++内存管理(超长)
    Flash, Flex, Air, Flashplayer之间的相互关系是什么?
    《KVM虚拟化技术实战和原理解析》读书笔记(十几篇)
    HNCU1323:算法2-1:集合union (线性表)
    Delphi XE7下如何创建一个Android模拟器调试
    DelphiXE Android的所有权限按照分类总结说明
    DelphiXE8怎么使用调试模式(朱建强)
    C++静态库中使用_declspec(dllexport) 不能导出函数的问题
  • 原文地址:https://www.cnblogs.com/RazerLu/p/3536936.html
Copyright © 2011-2022 走看看