二叉树的层次遍历2

leetcode 题目

二叉树的层次遍历,定义一个新的 TreeLevelNode 类记录当前节点属于哪一层。
初始化时,层数为0,并且将根节点赋值为第1层元素,再入队列。
出队列时,判断如果是新的一层的元素,则创建 list,并且半当前层数切换到新的层数。否则,list 不变,直接添加当前层的元素。

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        if(root == null){
            return Collections.emptyList();
        }

        List<List<Integer>> result = new ArrayList<>();
        levelOrder(root, result);
        return result;
    }

    private void levelOrder(TreeNode root, List<List<Integer>> result){
        Queue<TreeLevelNode> queue = new LinkedList<>();
        TreeLevelNode levelRoot = new TreeLevelNode(root, 1);
        //init
        queue.offer(levelRoot);
        int level = 0;
        List<Integer> newLevelList = null;
        while(!queue.isEmpty()){
            TreeLevelNode current = queue.poll();
            int nodeLevel = current.getLevel();

            if(nodeLevel > level){
                //用来保存新的一层元素
                newLevelList = new LinkedList<>();
                //
                level = nodeLevel;
                //创建了一个list 保存新的一层的元素,这一层的list对象 add 到 result。
                result.add(newLevelList);
            }
            newLevelList.add(current.node.val);

            if(current.node.left != null){
                queue.offer(new TreeLevelNode(current.node.left, nodeLevel+1));
            }

            if(current.node.right != null){
                queue.offer(new TreeLevelNode(current.node.right, nodeLevel+1));
            }
        }
    }


    private static class TreeLevelNode{
        int level;
        TreeNode node;
        public TreeLevelNode(TreeNode node, int level){
            this.node = node;
            this.level = level;
        }

        public int getLevel(){
            return level;
        }
    }
}

参考文档:二叉树的层序遍历算法实现

posted @ 2024-03-09 17:04  大熊猫同学  阅读(5)  评论(0编辑  收藏  举报