树:求树的层数 (Java)

这篇博客主要介绍了如何使用Java计算一棵树的层数,包括两种不同的实现方法,并给出了具体的运行结果。此外,还提及了相关扩展,如输出所有节点的层数、分层输出节点以及获取特定层节点的Java解法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题

              1
       2             3
         4         5  6
                 7

输出该树的层数

 

二、代码

Java

两种方法

@Data
public class Node {
    private Integer id;
    private Node left;
    private Node right;

    public Node(Integer id) {
        this.id = id;
    }

    public Node(Integer id, Node left, Node right) {
        this.id = id;
        this.left = left;
        this.right = right;
    }
}




@Data
public class Tree {
    private Node root;

    /**
     * 建树 【V80】
     *
     *              1
     *       2             3
     *         4         5  6
     *                 7
     */
    public void build() {
        Node node7 = new Node(7);
        Node node6 = new Node(6);
        Node node5 = new Node(5, node7, null);
        Node node4 = new Node(4);
        Node node3 = new Node(3, node5, node6);
        Node node2 = new Node(2, null, node4);
        root = new Node(1, node2, node3);
    }

    /**
     * 求树的层数
     */
    public int getLevel(Node root) {
        if (root == null) {
            return 0;
        }

        int level = 1;
        Node levelFirstNode = root;    //每层的第一个节点
        boolean canLevelPlus = false;  //level是否能+1

        Queue<Node> queue = new LinkedList<>();
        queue.offer(root);

        while (!queue.isEmpty()) {
            Node head = queue.poll();

            //已经拿到level层的第一个节点,只要该层有节点存在左孩子或右孩子,level就+1
            if (Objects.equals(head.getId(), levelFirstNode.getId())) {
                canLevelPlus = true;
            }

            if (head.getLeft() != null) {
                queue.offer(head.getLeft());

                if (canLevelPlus) {
                    level ++;
                    levelFirstNode = head.getLeft();
                    canLevelPlus = false;
                }
            }

            if (head.getRight() != null) {
                queue.offer(head.getRight());

                if (canLevelPlus) {
                    level ++;
                    levelFirstNode = head.getRight();
                    canLevelPlus = false;
                }
            }
        }

        return level;
    }


    /**
     * 求树的层数
     */
    public int getLevel2(Node root) {
        if (root == null) {
            return 0;
        }

        int level = 0;
        Node nextLevelFirstNode = root;    //level下一层的第一个节点

        Queue<Node> queue = new LinkedList<>();
        queue.offer(root);

        while (!queue.isEmpty()) {
            Node head = queue.poll();

            //到下一层的第一个节点了,level才+1
            if (nextLevelFirstNode != null && Objects.equals(head.getId(), nextLevelFirstNode.getId())) {
                level ++;
                nextLevelFirstNode = null;
            }

            if (head.getLeft() != null) {
                queue.offer(head.getLeft());

                if (nextLevelFirstNode == null) {
                    nextLevelFirstNode = head.getLeft();
                }
            }

            if (head.getRight() != null) {
                queue.offer(head.getRight());

                if (nextLevelFirstNode == null) {
                    nextLevelFirstNode = head.getRight();
                }
            }
        }

        return level;
    }

    public static void main(String[] args) {
        Tree tree = new Tree();
        tree.build();

        System.out.println(tree.getLevel(tree.getRoot()));
        System.out.println(tree.getLevel2(tree.getRoot()));
    }
}

运行结果

4
4

三、扩展

扩展

     树:求树的层数 (Java)

     树:输出所有节点的层数 (Java)

     树:分层输出所有的节点 (Java)

     树:获取某一层的所有节点 (Java)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值