码迷,mamicode.com
首页 > 其他好文 > 详细

102. Binary Tree Level Order Traversal

时间:2018-09-28 23:01:48      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:eve   bin   return   style   一个   元素   利用   img   nbsp   

一、题目

  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);
    }

 

102. Binary Tree Level Order Traversal

标签:eve   bin   return   style   一个   元素   利用   img   nbsp   

原文地址:https://www.cnblogs.com/skillking/p/9721361.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!