LeetCode之二叉树层次遍历

打印 上一主题 下一主题

主题 909|帖子 909|积分 2727

199. 二叉树的右视图

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;
  5. *     TreeNode left;
  6. *     TreeNode right;
  7. *     TreeNode() {}
  8. *     TreeNode(int val) { this.val = val; }
  9. *     TreeNode(int val, TreeNode left, TreeNode right) {
  10. *         this.val = val;
  11. *         this.left = left;
  12. *         this.right = right;
  13. *     }
  14. * }
  15. */
  16. class Solution {
  17.     // 存储每层的节点值
  18.     List<List<Integer>> levels = new ArrayList<>();
  19.     // 主方法:返回二叉树的右视图
  20.     public List<Integer> rightSideView(TreeNode root) {
  21.         List<Integer> result = new ArrayList<>(); // 存储最终的右视图
  22.         // 边界条件判断,如果树为空,直接返回空数组
  23.         if (root == null) {
  24.             return result;
  25.         }
  26.         // 进行层序遍历,填充 levels
  27.         helper(root, 0);
  28.         // 输出每层的节点值(用于调试)
  29.         System.out.println(levels);
  30.         
  31.         // 获取每层最右边的值
  32.         for (List<Integer> list : levels) {
  33.             result.add(list.get(list.size() - 1)); // 将每层最后一个元素加入结果
  34.         }
  35.         return result; // 返回右视图的结果
  36.     }
  37.     // 递归辅助方法进行层序遍历
  38.     public void helper(TreeNode root, int level) {
  39.         // 如果当前层与 levels 数组的大小一致,表示需要新建一个列表来存储当前层的元素
  40.         if (levels.size() == level) {
  41.             levels.add(new ArrayList<>()); // 新建一个空列表
  42.         }
  43.         // 将当前节点的值加入对应层级的列表中
  44.         levels.get(level).add(root.val);
  45.         // 如果当前节点有左子树,继续递归到左子树,层级 +1
  46.         if (root.left != null) {
  47.             helper(root.left, level + 1);
  48.         }
  49.         // 如果当前节点有右子树,继续递归到右子树,层级 +1
  50.         if (root.right != null) {
  51.             helper(root.right, level + 1);
  52.         }     
  53.     }
  54. }
复制代码
637. 二叉树的层平均值

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;
  5. *     TreeNode left;
  6. *     TreeNode right;
  7. *     TreeNode() {}
  8. *     TreeNode(int val) { this.val = val; }
  9. *     TreeNode(int val, TreeNode left, TreeNode right) {
  10. *         this.val = val;
  11. *         this.left = left;
  12. *         this.right = right;
  13. *     }
  14. * }
  15. */
  16. class Solution {
  17.     // 计算二叉树每一层节点值的平均值,并返回一个包含平均值的列表
  18.     public List<Double> averageOfLevels(TreeNode root) {
  19.         // 用于存储每一层节点的数量
  20.         List<Integer> count = new ArrayList<>();
  21.         // 用于存储每一层节点值的总和
  22.         List<Double> sum = new ArrayList<>();
  23.         // 调用深度优先搜索方法进行计算
  24.         dfs(root, 0, count, sum);
  25.         // 用于存储每一层的平均值
  26.         List<Double> averages = new ArrayList<>();
  27.         // 计算每一层的平均值并添加到 averages 列表中
  28.         for (int i = 0; i < sum.size(); i++) {
  29.             averages.add(sum.get(i) / count.get(i));
  30.         }
  31.         return averages;
  32.     }
  33.     // 深度优先搜索方法
  34.     private void dfs(TreeNode root, Integer level, List<Integer> count, List<Double> sum) {
  35.         // 如果根节点为空,直接返回
  36.         if (root == null) {
  37.             return;
  38.         }
  39.         // 如果当前层已经在 sums 和 counts 列表中有记录
  40.         if (level < sum.size()) {
  41.             // 更新当前层的节点值总和
  42.             sum.set(level, sum.get(level) + root.val);
  43.             // 更新当前层的节点数量
  44.             count.set(level, count.get(level) + 1);
  45.         } else {
  46.             // 如果当前层是新的一层,添加新的总和和数量记录
  47.             sum.add(root.val * 1.0);
  48.             count.add(1);
  49.         }
  50.         // 递归搜索左子树
  51.         dfs(root.right, level + 1, count, sum);
  52.         // 递归搜索右子树
  53.         dfs(root.left, level + 1, count, sum);
  54.     }
  55. }
复制代码
102. 二叉树的层序遍历

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;
  5. *     TreeNode left;
  6. *     TreeNode right;
  7. *     TreeNode() {}
  8. *     TreeNode(int val) { this.val = val; }
  9. *     TreeNode(int val, TreeNode left, TreeNode right) {
  10. *         this.val = val;
  11. *         this.left = left;
  12. *         this.right = right;
  13. *     }
  14. * }
  15. */
  16. class Solution {
  17.     // 存储每层的节点值
  18.     List<List<Integer>> levels = new ArrayList<>();
  19.     // 主方法:返回二叉树的层序遍历结果
  20.     public List<List<Integer>> levelOrder(TreeNode root) {
  21.         // 如果根节点为空,直接返回 levels(会是空列表)
  22.         if (root == null) {
  23.             return levels;
  24.         }
  25.         // 调用辅助方法进行层序遍历
  26.         helper(root, 0);
  27.         // 返回层序遍历结果
  28.         return levels;
  29.     }
  30.     // 递归辅助方法进行层序遍历
  31.     public void helper(TreeNode root, Integer level) {
  32.         // 如果当前层级与 levels 的大小一致,表示需要新建一个列表来存储当前层的节点
  33.         if (levels.size() == level) {
  34.             levels.add(new ArrayList<>()); // 新建一个空的子列表
  35.         }
  36.         // 将当前节点的值加入对应层的列表中
  37.         levels.get(level).add(root.val);
  38.         // 如果当前节点有左子节点,递归处理左子树,层级 +1
  39.         if (root.left != null) {
  40.             helper(root.left, level + 1);
  41.         }
  42.         // 如果当前节点有右子节点,递归处理右子树,层级 +1
  43.         if (root.right != null) {
  44.             helper(root.right, level + 1);
  45.         }
  46.     }
  47. }
复制代码
103. 二叉树的锯齿形层序遍历

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;
  5. *     TreeNode left;
  6. *     TreeNode right;
  7. *     TreeNode() {}
  8. *     TreeNode(int val) { this.val = val; }
  9. *     TreeNode(int val, TreeNode left, TreeNode right) {
  10. *         this.val = val;
  11. *         this.left = left;
  12. *         this.right = right;
  13. *     }
  14. * }
  15. */
  16. class Solution {
  17.     public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
  18.         List<List<Integer>> ans = new ArrayList<>(); // 用于存放最终结果
  19.         if (root == null) { // 如果根节点为空,返回空的结果
  20.             return ans;
  21.         }
  22.         Queue<TreeNode> nodeQueue = new ArrayDeque<>(); // 初始化队列以进行层次遍历
  23.         nodeQueue.offer(root); // 将根节点加入队列
  24.         boolean isLeftOrder = true; // 标志变量,指示当前层的遍历顺序
  25.         // 当队列不为空时,进行遍历
  26.         while (!nodeQueue.isEmpty()) {
  27.             Deque<Integer> levelList = new LinkedList<>(); // 使用双端队列存储当前层的节点值
  28.             int size = nodeQueue.size(); // 记录当前层的节点数量
  29.             // 遍历当前层的所有节点
  30.             for (int i = 0; i < size; i++) {
  31.                 TreeNode curNode = nodeQueue.poll(); // 从队列中取出当前节点
  32.                 // 根据当前层的遍历顺序,决定如何添加节点值
  33.                 if (isLeftOrder) {
  34.                     levelList.offerLast(curNode.val); // 从尾部添加节点值(左到右)
  35.                 } else {
  36.                     levelList.offerFirst(curNode.val); // 从头部添加节点值(右到左)
  37.                 }
  38.                 // 将当前节点的左子节点加入队列
  39.                 if (curNode.left != null) {
  40.                     nodeQueue.offer(curNode.left);
  41.                 }
  42.                 // 将当前节点的右子节点加入队列
  43.                 if (curNode.right != null) {
  44.                     nodeQueue.offer(curNode.right);
  45.                 }
  46.             }
  47.             // 将当前层的值转换为列表并添加到结果集合中
  48.             ans.add(new ArrayList<>(levelList));
  49.             // 切换当前层的遍历顺序
  50.             isLeftOrder = !isLeftOrder; // 反转顺序
  51.         }
  52.         return ans; // 返回包含锯齿形层次遍历的所有节点值的结果
  53.     }
  54. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表