• 二叉树分层遍历


    102. 二叉树的层序遍历

    层序遍历 

    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

    示例 1:

    输入:root = [3,9,20,null,null,15,7]
    输出:[[3],[9,20],[15,7]]
    

    示例 2:

    输入:root = [1]
    输出:[[1]]
    

    示例 3:

    输入:root = []
    输出:[]
    

    提示:

    • 树中节点数目在范围 [0, 2000] 内
    • -1000 <= Node.val <= 1000

    在Java中,二叉树的分层遍历通常指的是层序遍历(Breadth-First Search, BFS),它按照树的层次顺序访问节点。为了实现这个功能,我们可以使用队列(Queue)来辅助遍历。下面是一个简单的Java代码示例,用于实现二叉树的分层遍历,并附带了详细的说明。
    首先,我们需要定义二叉树节点的数据结构:

    1. public class TreeNode {
    2.     int val;
    3.     TreeNode left;
    4.     TreeNode right;
    5.     TreeNode(int x) {
    6.         val = x;
    7.     }
    8. }


    接下来是实现分层遍历的Java方法:
     

    1. import java.util.LinkedList;
    2. import java.util.Queue;
    3. public class BinaryTreeLevelOrderTraversal {
    4.     // 二叉树的分层遍历(层序遍历)
    5.     public List> levelOrder(TreeNode root) {
    6.         List> result = new ArrayList<>();
    7.         if (root == null) {
    8.             return result;
    9.         }
    10.         // 使用队列来进行层序遍历
    11.         Queue queue = new LinkedList<>();
    12.         queue.offer(root); // 将根节点加入队列
    13.         while (!queue.isEmpty()) {
    14.             int levelSize = queue.size(); // 当前层的节点数量
    15.             List levelNodes = new ArrayList<>(); // 存储当前层的节点值
    16.             // 遍历当前层的所有节点
    17.             for (int i = 0; i < levelSize; i++) {
    18.                 TreeNode currentNode = queue.poll(); // 取出队首节点
    19.                 levelNodes.add(currentNode.val); // 将节点值加入当前层列表
    20.                 // 将当前节点的子节点加入队列
    21.                 if (currentNode.left != null) {
    22.                     queue.offer(currentNode.left);
    23.                 }
    24.                 if (currentNode.right != null) {
    25.                     queue.offer(currentNode.right);
    26.                 }
    27.             }
    28.             // 当前层遍历完毕,将当前层的节点值列表加入结果列表
    29.             result.add(levelNodes);
    30.         }
    31.         return result;
    32.     }
    33.     // 主函数用于测试
    34.     public static void main(String[] args) {
    35.         // 构造一个简单的二叉树进行测试
    36.         TreeNode root = new TreeNode(3);
    37.         root.left = new TreeNode(9);
    38.         root.right = new TreeNode(20);
    39.         root.right.left = new TreeNode(15);
    40.         root.right.right = new TreeNode(7);
    41.         BinaryTreeLevelOrderTraversal traversal = new BinaryTreeLevelOrderTraversal();
    42.         List> result = traversal.levelOrder(root);
    43.         // 输出分层遍历的结果
    44.         for (List level : result) {
    45.             System.out.println(level);
    46.         }
    47.     }
    48. }


    详细说明:
    定义数据结构:首先,我们定义了一个TreeNode类来表示二叉树的节点,包含节点的值以及左右子节点的引用。
    实现分层遍历:在BinaryTreeLevelOrderTraversal类中,我们实现了levelOrder方法来进行分层遍历。该方法接收一个TreeNode类型的根节点作为参数,并返回一个二维列表List>,其中每个内部列表List代表一层节点的值。
    使用队列:我们使用了Java的LinkedList作为队列来实现层序遍历。队列的特性是先进先出(FIFO),非常适合用来进行层次遍历。
    遍历过程:
    首先,检查根节点是否为空,如果为空则直接返回空结果列表。
    将根节点加入队列。
    当队列不为空时,进行循环遍历。在每次循环中,首先获取当前层的节点数量levelSize,然后遍历当前层的所有节点。对于每个节点,将其值加入当前层的列表levelNodes,并将其子节点(如果存在)加入队列。
    当当前层的所有节点都遍历完毕后,将当前层的节点值列表levelNodes加入结果列表result。
    主函数测试:在main方法中,我们构造了一个简单的二叉树,并调用levelOrder方法进行测试。最后,我们遍历结果列表并打印每一层的节点值。
    通过上面的代码和说明,你应该能够清楚地理解如何在Java中实现二叉树的分层遍历。

    每层最大值 

    1. public List findMaxvalue(TreeNode root) {
    2. List maxValuseIntegers = new ArrayList();
    3. if (root == null) {
    4. return maxValuseIntegers;
    5. }
    6. Queue queue = new LinkedList();
    7. queue.offer(root);
    8. while(!queue.isEmpty()) {
    9. int levelMaxValue = Integer.MIN_VALUE;
    10. // 这个地方是关键
    11. int levelSize = queue.size();
    12. for (int i = 0; i < levelSize; i++) {
    13. TreeNode node = queue.poll();
    14. levelMaxValue = Math.max(levelMaxValue, node.val);
    15. if (node.left != null) {
    16. queue.offer(node.left);
    17. }
    18. if (node.right != null) {
    19. queue.offer(node.right);
    20. }
    21. }
    22. maxValuseIntegers.add(levelMaxValue);
    23. }
    24. return maxValuseIntegers;
    25. }

  • 相关阅读:
    link 和@improt的区别
    关于javaFx tableView组件绑定Map数据
    深入类加载机制
    记录轮播图
    springcloud - ribbon 饥饿加载
    QtDay4
    Java 类型转换和运算符计算
    Android本地文件操作
    面试中常见的的 web 安全问题
    支持向量机(SVM)----sklearn库的应用
  • 原文地址:https://blog.csdn.net/opentogether/article/details/139308573