• 剑指offer_22:从上往下打印二叉树


    从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

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

    返回:
    [3,9,20,15,7]

    提示:
    节点总数 <= 1000

    BFS

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public int[] levelOrder(TreeNode root) {
            if(root==null) return new int[0];
            Queue<TreeNode> queue=new LinkedList<>();
            List<Integer> list=new ArrayList<>();
            queue.offer(root);
            while(!queue.isEmpty()){
                TreeNode node=queue.poll();
                list.add(node.val);
                if(node.left!=null) queue.offer(node.left);
                if(node.right!=null) queue.offer(node.right);
            }
            int[] res=new int[list.size()];
            for(int i=0;i<list.size();i++){
                res[i]=list.get(i);
            }
            return res;
        }
    }
    

    提高1:

    从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

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

    返回其层次遍历结果:
    [
    [3],
    [9,20],
    [15,7]
    ]

    提示:
    节点总数 <= 1000

    1、BFS

    /**
     * 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>> levelOrder(TreeNode root) {
            List<List<Integer>> res=new ArrayList<>();
            if(root==null) return res;
            Queue<TreeNode> queue=new LinkedList<>();
            queue.offer(root);
            while(!queue.isEmpty()){
                List<Integer> list=new ArrayList<>();
                int size=queue.size();
                for(int i=0;i<size;i++){
                    TreeNode node=queue.poll();
                    list.add(node.val);
                    if(node.left!=null) queue.offer(node.left);
                    if(node.right!=null) queue.offer(node.right);
                }
                res.add(list);
            }
            return res;
        }
    }
    

    2、DFS

    /**
     * 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>> levelOrder(TreeNode root) {
            List<List<Integer>> res=new ArrayList<>();
            levelOrder(root,res,0);
            return res;
        }
        public void levelOrder(TreeNode root,List<List<Integer>> res,int level){
            if(root==null) return;
            if(level>=res.size()){
                res.add(new ArrayList<Integer>());
            }
            res.get(level).add(root.val);
            if(root.left!=null) levelOrder(root.left,res,level+1);
            if(root.right!=null) levelOrder(root.right,res,level+1);
        }
    }
    

    提高2:

    请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

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

    返回其层次遍历结果:
    [
    [3],
    [20,9],
    [15,7]
    ]

    提示:
    节点总数 <= 1000

    /**
     * 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>> levelOrder(TreeNode root) {
            List<List<Integer>> res=new ArrayList<>();
            if(root==null) return res;
            Queue<TreeNode> queue=new LinkedList<>();
            queue.offer(root);
            int level=1;
            while(!queue.isEmpty()){
                LinkedList<Integer> list=new LinkedList<>();
                int size=queue.size();
                for(int i=0;i<size;i++){
                    TreeNode node=queue.poll();
                    if(level%2!=0){
                        list.addLast(node.val);
                    }else{
                        list.addFirst(node.val);
                    }
                    if(node.left!=null) queue.offer(node.left);
                    if(node.right!=null) queue.offer(node.right);
                }
                level++;
                res.add(list);
            }
            return res;
        }
    }
    
  • 相关阅读:
    JUC组件扩展(二)-JAVA并行框架Fork/Join(四):监控Fork/Join池
    JUC组件扩展(二)-JAVA并行框架Fork/Join(三):在任务中抛出异常
    JUC组件扩展(二)-JAVA并行框架Fork/Join(二):同步和异步
    JUC组件扩展(二)-JAVA并行框架Fork/Join(一):简介和代码示例
    JUC组件扩展(一):FutureTask理解
    JUC之AQS
    mysqldump全量备份+mysqlbinlog二进制日志增量备份
    linux下利用shell脚本和mysqldump热备份和恢复mysql
    分布式链路追踪(Tracing)系统 – Jaeger在Golang中的使用
    微服务的时间和成本去哪儿了
  • 原文地址:https://www.cnblogs.com/xyz-1024/p/14159976.html
Copyright © 2020-2023  润新知