leetcode习题集——102. 二叉树的层次遍历

129 篇文章 0 订阅
42 篇文章 0 订阅

题目

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],
在这里插入图片描述

算法

public class P102 {
    /**
     * 层序遍历
     * 递归
     */
    public List<List<Integer>> levelOrder(TreeNode Node) {
        List<List<Integer>> rList = new ArrayList<>();
        if (Node == null) {
            return rList;
        }
        //求树的深度
        int depth = depth(Node);
        //根据层次进行遍历
        for (int i = 1; i <= depth; i++) {
            List<Integer> leveli = new ArrayList<>();
            levelOrder(Node, i,leveli);
            rList.add(leveli);
        }
        return rList;
    }

    private void levelOrder(TreeNode Node, int level,List<Integer> leveli) {
        if (Node == null || level < 1) {
            return;
        }

        if (level == 1) {
            leveli.add(Node.val);
            return;
        }
        // 左子树
        levelOrder(Node.left, level - 1,leveli);
        // 右子树
        levelOrder(Node.right, level - 1,leveli);
    }
    /**
     * 求树高
     * 递归
     */
    public int depth(TreeNode Node) {
        if (Node == null) {
            return 0;
        }
        int l = depth(Node.left);
        int r = depth(Node.right);
        if (l > r) {
            return l + 1;
        } else {
            return r + 1;
        }
    }
}

思路:递归求解,先求树高,再一层一层的遍历打印

算法2

public class P102_2 {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> rList = new ArrayList<>();
        if (root == null) {
            return rList;
        }
        TreeLevel binaryNode;
        Queue<TreeLevel> queue = new LinkedList<>();
        //根节点入队
        queue.add(new TreeLevel(root,0));

        while (queue.size() != 0) {
            List<Integer> leveli ;
            //根节点出队
            binaryNode = queue.poll();
            //访问
            try{
                leveli = rList.get(binaryNode.level);
            }catch (IndexOutOfBoundsException e){
                leveli = new ArrayList<>();
                rList.add(leveli);
            }
            leveli.add(binaryNode.node.val);
            if (binaryNode.node.left != null) {
                //左子树入队
                queue.offer(new TreeLevel(binaryNode.node.left,binaryNode.level+1));
            }
            if (binaryNode.node.right != null) {
                //右子树入队
                queue.offer(new TreeLevel(binaryNode.node.right,binaryNode.level+1));
            }
        }
        return rList;
    }
    private class TreeLevel{
        public int level;
        public TreeNode node;
        public TreeLevel(TreeNode node,int level){
            this.level = level;
            this.node = node;
        }
        public int getLevel() {
            return level;
        }

        public void setLevel(int level) {
            this.level = level;
        }

        public TreeNode getNode() {
            return node;
        }

        public void setNode(TreeNode node) {
            this.node = node;
        }
    }
}

思路:入队出队实现层次遍历

算法3

public class P102_4 {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> list = new ArrayList<>();
        if(root==null){
            return list;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        int length = 1;
        while(!queue.isEmpty()){
            List<Integer> subList = new ArrayList<>();
            for(int i=0;i<length;i++){
                TreeNode t = queue.poll();
                if(t==null){
                    continue;
                }
                subList.add(t.val);
                if(t.left!=null){
                    queue.add(t.left);
                }
                if(t.right!=null){
                    queue.add(t.right);
                }
            }
            list.add(subList);
            length=queue.size();
        }
        return list;
    }
}

思想:队列实现层次遍历,层次输出,这里用length记录了每一层的个数

算法4

public class P102_3 {
    public List<List<Integer>> levelOrder(TreeNode root) {
        if (root == null) return new ArrayList<>();
        List<List<Integer>> result = new ArrayList<>();
        dfs(root, 0, result);
        return result;
    }
    //思想:前序遍历,层次输出
    public void dfs(TreeNode node, int level, List<List<Integer>> result) {
        if (node == null) return;
        if (result.size() < level + 1) result.add(new ArrayList<>());
        result.get(level).add(node.val);
        dfs(node.left, level + 1, result);
        dfs(node.right, level + 1, result);
    }
}

思想:前序遍历,层次输出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值