• 从上到下打印二叉树 III


    题解1:基于上一题的递归,给递归函数再加一个变量,代表从左往右还是从右往左

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        List<List<Integer>> node=new ArrayList();
        public List<List<Integer>> levelOrder(TreeNode root) {
            //flag=1表示从左到右
            lei(root,0,true);
            return node;
        }
        public void lei(TreeNode root,int k,boolean flag){
            if(root!=null){
                if(node.size()<=k)node.add(new ArrayList());
                
                if(flag){
                    node.get(k).add(root.val);
                    
                }else{
                    node.get(k).add(0,root.val);
                    
                }
                lei(root.left,k+1,!flag);
                lei(root.right,k+1,!flag);
            }
        }
    }
    

    题解2:层序遍历加倒序

    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            Queue<TreeNode> queue = new LinkedList<>();
            List<List<Integer>> res = new ArrayList<>();
            if(root != null) queue.add(root);
            while(!queue.isEmpty()) {
                List<Integer> tmp = new ArrayList<>();
                for(int i = queue.size(); i > 0; i--) {
                    TreeNode node = queue.poll();
                    tmp.add(node.val);
                    if(node.left != null) queue.add(node.left);
                    if(node.right != null) queue.add(node.right);
                }
                if(res.size() % 2 == 1) Collections.reverse(tmp);
                res.add(tmp);
            }
            return res;
        }
    }
    

    题解3:双端队列

    法2优缺点:

    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            Deque<TreeNode> deque = new LinkedList<>();
            List<List<Integer>> res = new ArrayList<>();
            if(root != null) deque.add(root);
            while(!deque.isEmpty()) {
                // 打印奇数层
                List<Integer> tmp = new ArrayList<>();
                for(int i = deque.size(); i > 0; i--) {
                    // 从左向右打印
                    TreeNode node = deque.removeFirst();
                    tmp.add(node.val);
                    // 先左后右加入下层节点
                    if(node.left != null) deque.addLast(node.left);
                    if(node.right != null) deque.addLast(node.right);
                }
                res.add(tmp);
                if(deque.isEmpty()) break;
                // 打印偶数层
                tmp = new ArrayList<>();
                for(int i = deque.size(); i > 0; i--) {
                    // 从右向左打印
                    TreeNode node = deque.removeLast();
                    tmp.add(node.val);
                    // 先右后左加入下层节点
                    if(node.right != null) deque.addFirst(node.right);
                    if(node.left != null) deque.addFirst(node.left);
                }
                res.add(tmp);
            }
            return res;
        }
    }
    
    

    链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/solution/mian-shi-ti-32-iii-cong-shang-dao-xia-da-yin-er--3/

  • 相关阅读:
    PLSQL登录弹出空白框如何解决
    mongodb常用命令
    js多线程?
    Rhino -- 基于java的javascript实现
    [原创]在Docker上部署mongodb分片副本集群。
    [原创]在Linux系统Ubuntu14.04上安装部署docker。
    [原创]Win7、Win8、Win10始终以管理员身份运行程序。
    [原创]WPF应用MediaPlayer播放声音断续、不全解决方案
    [原创]C#引用C++编译的dll
    [原创]导出CSV文件,特殊字符处理。
  • 原文地址:https://www.cnblogs.com/treasury/p/12742689.html
Copyright © 2020-2023  润新知