加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

102. Binary Tree Level Order Traversal

发布时间:2020-12-14 04:21:45 所属栏目:大数据 来源:网络整理
导读:一、题目 1、审题 2、分析 给出一个二叉树,将每一层节点值放在一个集合中,最终返回每一层节点值的所有集合。 ? 二、解答 1、思路: 方法一、 ①、首先,二叉树父即节点入队列。 ②、队列头结点依次出队列,直到队列为空,并将每次出队列的队头节点放在一个

一、题目

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读