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

    一、题目

      1、审题

      2、分析

      给出一个二叉树,将每一层节点值放在一个集合中,最终返回每一层节点值的所有集合。

    二、解答

      1、思路:

        方法一、

        ①、首先,二叉树父即节点入队列。

        ②、队列头结点依次出队列,直到队列为空,并将每次出队列的队头节点放在一个 List 中

        ③、若队列为空时,说明这一层所有节点都放入了 List 中,此时,将 List 中节点的非空子节点依次入队列,即为下一层的所有节点;

           同时将此时 List 中的所有节点值放在一个集合中记录,并清空 List, 开始下一层节点的遍历。

        ④、若 队列与 List 均为空,说明查找结束。

        public List<List<Integer>> levelOrder(TreeNode root) {
            
            List<List<Integer>> resultList = new ArrayList<List<Integer>>();
            
            if(root == null) 
                return resultList;
            
            Queue<TreeNode> queue = new LinkedList<TreeNode>();
            queue.add(root);
            List<TreeNode> list = new LinkedList<TreeNode>();
            while(!queue.isEmpty()) {
                list.add(queue.poll());    // 队列头结点入 List
                
                if(queue.isEmpty() && list.size() > 0) {
                    
                    List<Integer> targetList = new LinkedList<Integer>();
                    for(TreeNode tmpNode: list) {
                        targetList.add(tmpNode.val);
                        if(tmpNode.left != null)
                            queue.add(tmpNode.left);
                        if(tmpNode.right != null)
                            queue.add(tmpNode.right);
                    }
                    list.clear();
                    resultList.add(targetList);
                }
            }
            
            return resultList;
        }

      方法二、

        直接利用 queue.size() 属性,获取队列中这一层元素的个数。

        public List<List<Integer>> levelOrder2(TreeNode root) {
            
            List<List<Integer>> resultList = new ArrayList<List<Integer>>();
            
            if(root == null) 
                return resultList;
            
            Queue<TreeNode> queue = new LinkedList<TreeNode>();
            queue.add(root);
            while (!queue.isEmpty()) {
                int levelNum = queue.size();
                List<Integer> subList = new LinkedList<>();
                for(int i = 0; i < levelNum; i++) {
                    TreeNode node = queue.poll();
                    if(node.left != null)
                        queue.add(node.left);
                    if(node.right != null)
                        queue.add(node.right);
                    subList.add(node.val);
                }
                resultList.add(subList);
            }
            return resultList;
        }

      方法三、

        采用递归将每一层的节点放入一个 List 中。

        public List<List<Integer>> levelOrder(TreeNode root) {
            
            List<List<Integer>> resultList = new ArrayList<List<Integer>>();
            levelHelper(resultList, root, 0);
            return resultList;
        }
        
        private void levelHelper(List<List<Integer>> resultList, TreeNode root,
                int height) {
            
            if(root == null) return;
            
            if(height >= resultList.size())
                resultList.add(new LinkedList<Integer>());
            
            resultList.get(height).add(root.val);
            levelHelper(resultList, root.left, height+1);
            levelHelper(resultList, root.right, height+1);
        }
  • 相关阅读:
    关于字体单位em的问题
    键盘按钮keyCode大全
    右侧导航栏(动态添加数据到list)
    当前页面点击取到值
    前端写分页(用了自己同事写的插件)
    选择控件js插件和使用方法
    Form表单验证
    前端页面跳转并取到值
    App配置页面头部
    json字符串、json对象、数组之间的转换
  • 原文地址:https://www.cnblogs.com/skillking/p/9721361.html
Copyright © 2011-2022 走看看