• 算法day26


    第一题

    429. N 叉树的层序遍历

    本题的要求我们可以通过队列来辅助完成层序遍历

    如下图的n叉树:

    步骤一:

            我们定义一个队列,先进行根节点入队列操作;

    步骤二:

            

            我们进行当前队列每一个元素的出队列操作,并将这个节点的值存放在tmp列表中;

    步骤三:

            

            我们将上面根节点的子节点进行遍历,并一一放入到队列中,同时在进行出队列的时候,每出一个队列,该节点的值存放到tmp中,同时该节点的子节点也进行入队列操作;最后每一层的数值都会存放到惹他中,开始新的一层数据存储

    最后结束后如下图所示:

            

    综上所述,代码如下:

    1. /*
    2. // Definition for a Node.
    3. class Node {
    4. public int val;
    5. public List children;
    6. public Node() {}
    7. public Node(int _val) {
    8. val = _val;
    9. }
    10. public Node(int _val, List _children) {
    11. val = _val;
    12. children = _children;
    13. }
    14. };
    15. */
    16. class Solution {
    17. public List> levelOrder(Node root) {
    18. List> ret = new ArrayList<>();
    19. if(root == null) return ret;
    20. Queue q = new LinkedList<>();
    21. q.add(root);
    22. while(!q.isEmpty()){
    23. int sz = q.size();//当前队列里的节点个数
    24. List tmp = new ArrayList<>();//用来统计本层的节点信息
    25. for(int i = 0; i
    26. Node t = q.poll();
    27. tmp.add(t.val);
    28. for(Node child:t.children){
    29. if(child != null) q.add(chile);
    30. }
    31. }
    32. ret.add(tmp);
    33. }
    34. return ret;
    35. }
    36. }

    第二题

    103. 二叉树的锯齿形层序遍历

            本题详细讲解如上题故事;

            至于区别就是从上往下数二叉树的偶数层,在放入到tmp表中之后进行逆转操作,然后将这些元素在放入到ret总表中,返回;

            综上所述,代码如下:

    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> zigzagLevelOrder(TreeNode root) {
    18. List> ret = new ArrayList<>();
    19. if(root == null) return ret;
    20. Queue q = new LinkedList<>();
    21. q.add(root);
    22. int floor = 1;
    23. while(!q.isEmpty()){
    24. int sz = q.size();//当前队列里的节点个数,当前层李米娜有多少元素
    25. List tmp = new ArrayList<>();//用来统计本层的节点信息
    26. for(int i = 0; i
    27. TreeNode t = q.poll();
    28. tmp.add(t.val);
    29. if(t.left != null)q.add(t.left);
    30. if(t.right != null)q.add(t.right);
    31. }
    32. if(floor % 2 == 0) Collections.reverse(tmp);
    33. ret.add(tmp);
    34. floor ++;
    35. }
    36. return ret;
    37. }
    38. }

     第三题

    662. 二叉树最大宽度

    下图两个实例如下所示:

      解法:利用数组存储二叉树的方式,给结点编号;(堆的思想)

    堆的数据结构:Pair

            我们将每一层的这种堆结构的结点放入到队列中,则该层的宽度就是该层最右边的节点下标减去-该层最左边的节点下标+1;

            同时每一层的宽度计算完成后,就将下一层的结点覆盖到队列中,重复计算每一层的节点宽度,直到求出最大值;

            综上所述,代码如下:

    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 int widthOfBinaryTree(TreeNode root) {
    18. List> q = new ArrayList<>();//用数组模拟队列
    19. q.add(new Pair(root,1));
    20. int ret = 0;//记录最终结果
    21. while(!q.isEmpty()){
    22. //先更新一下这一层的宽度
    23. Pair t1 = q.get(0);
    24. Pair t2 = q.get(q.size()-1);
    25. ret = Math.max(ret,t2.getValue() - t1.getValue() +1);
    26. //让下一层进队
    27. List> tmp = new ArrayList<>();//用数组模拟队列
    28. for(Pair t:q){
    29. TreeNode node = t.getKey();
    30. int index = t.getValue();
    31. if(node.left != null){
    32. tmp.add(new Pair(node.left,index*2));
    33. }
    34. if(node.right != null){
    35. tmp.add(new Pair(node.right,index*2+1));
    36. }
    37. }
    38. q = tmp;
    39. }
    40. return ret;
    41. }
    42. }

    ps:本次的内容就到这里,如果对你有所帮助的话就请一键三连哦!!! 

  • 相关阅读:
    OD_2024_C卷_200分_1、爱吃蟠桃的孙悟空【JAVA】【二分法】
    暑假超越计划练习题(6)
    小程序开发.uniapp.生命周期
    注意!11月PMP考试时间已定!
    如何针对数据中心进行安全疏散和消防应急管理
    FFmepg--内存IO模式
    springboot实现redisson分布式锁案例
    【笔试强训】Day 3
    chromium windows编译32位正式版
    1210、MHA集群
  • 原文地址:https://blog.csdn.net/2202_76101487/article/details/139618817