算法记录——树

news2024/9/26 15:04:58

 二叉树

3.1二叉树的最大深度

思路:二叉树的最大深度 = 根节点的最大高度。因此本题可以转换为求二叉树的最大高度。

        而求高度的时候应该采用后序遍历。遍历顺序为:左右中。每次遍历的节点按后序遍历顺序,先收集左右孩子的最大高度,再最后处理当前节点的最大高度!因此用后序遍历。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        //注意:这题虽然求的是最大的深度,但我们可以转换思路。求树的最大深度 = 根节点的最大高度!
        if(root == null) return 0;
        //当前节点左孩子的高度
        int leftHeight = maxDepth(root.left);
        //当前节点右孩子的高度
        int rightHeight = maxDepth(root.right);
        return Math.max(leftHeight,rightHeight) + 1;//当前节点的最大高度就是左右孩子中更高的那个+1
    }
}

3.2 搜索二叉树的判断

思路:

        首先我们知道二叉搜索树的性质:任何一个节点的左子树的所有节点的值都小于该节点的值,右子树的所有节点的值都大于该节点的值。

        由这个性质我们可以知道,对于一个二叉搜索树,中序遍历这个树,得到的结构一定是升序的!

方法一:利用额外的集合,先中序遍历整个树,把每个值取到。再判断集合中是否为升序排序。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public static boolean isValidBST(TreeNode root) {
        if(root.left == null && root.right == null) return true;
        ArrayList<Integer> arr = new ArrayList();//用于存放每个节点值的集合
        f(root,arr);
        for (int i = 0; i < arr.size() - 1; i++) {
            if (arr.get(i + 1) <= arr.get(i)) {
                return false;
            }
        }
        return true;
    }

    public static void f(TreeNode root, ArrayList arr) {//中序遍历
        if (root == null) return;
        f(root.left,arr);
        arr.add(root.val);
        f(root.right,arr);
    }
}

方法二:定义一个变量,用于保存每次要比较值的上一个值的大小。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public static boolean isValidBST(TreeNode root) {
        if (root.left == null && root.right == null) return true;
        Stack<TreeNode> stack = new Stack<>();
        int preValue = Integer.MIN_VALUE;
        while (!stack.isEmpty() || root != null) {
            if (root != null) {//先一路把当前节点的左孩子全部遍历进栈
                stack.push(root);
                root = root.left;
            } else {//总有一个时刻root跑到null,说明当前点没有左孩子
                root = stack.pop();//root赋值为最后一个进栈的没有左孩子的节点

                //这里刚遍历完当前节点的左孩子,如果在这里打印就是中序遍历
                //System.out.print(root.val);
                //所以我们在这里每次比较当前节点,和前一个要比较节点的大小,就相当于中序遍历
                if (root.val > preValue || root.val == Integer.MIN_VALUE) {//说明当前节点满足搜索二叉树的性质
                    preValue = root.val;
                } else {//否则不满足搜索二叉树,直接返回false
                    return false;
                }
                
                root = root.right;//遍历当前节点的右孩子
            }
        }
        return true;
    }
}

3.3 判断完全二叉树

先说下性质:

满二叉树:在一颗二叉树中,如果每个结点都存在左子树和右子树,并且所有叶节点都在同一层上,这样的树为满二叉树。
完全二叉树:相同深度的满二叉树的所有结点(不包含叶子)在该树上都有相应的节点(包含叶子)与之对应且所有左子树先存在,才会存在右子树,然后才会存在下层子树的情况,这样的树为完全二叉树 。
可根据下图区分:

思路:层序遍历,根据完全二叉树的性质。

1.当有节点存在有右孩子没左孩子的时候,直接返回false

2.当遍历到第一个叶子节点时,要确保接下来每一个节点都是叶子节点!

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isCompleteTree(TreeNode root) {
         if (root == null) return true;
        //创建一个队列用来做层序遍历
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        TreeNode l = null;//代表当前节点的左孩子
        TreeNode r = null;//代表当前节点的右孩子
        Boolean leaf = false;//一个开关,代表当前有没有遍历到叶子节点
        while (!queue.isEmpty()) {
            root = queue.poll();
            l = root.left;
            r = root.right;
            if (
             (leaf && (l != null || r != null))//前面已经存在叶子节点了,但当前节点不是叶子节点
                            ||
             (l == null && r != null)//有右无左直接返回false
            ) return false;
            if (l == null || r == null) leaf = true;//如果当前节点是叶子节点
            if (l != null) queue.add(l);
            if (r != null) queue.add(r);
        }
        return true;
    }
}

3.4判断平衡二叉树

思路:

根据平衡二叉树的性质,判断当前节点下的树是不是平衡二叉树,只要做到一下几点判断:

1.左孩子要是平衡二叉树

2.右孩子要是平衡二叉树

3.左右孩子的高度差小于等于1

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isBalanced(TreeNode root) {
        if (root == null) return true;
        boolean leftBalanced = isBalanced(root.left);//判断当前节点左子树是不是平衡二叉树
        boolean rightBalanced = isBalanced(root.right);//判断当前节点右子树是不是平衡二叉树
        int leftHeight = getHeight(root.left);//获取左子树高度
        int rightHeight = getHeight(root.right);//获取右子树高度
        //只有当左右子树都为平衡二叉树且左右子树高度差<=1时,当前点才是平衡二叉树
        return leftBalanced && rightBalanced && (Math.abs(leftHeight - rightHeight) <= 1);
    }

    public static int getHeight(TreeNode root) {//获取当前节点的高度
        if (root == null) return 0;
        int leftHeight = getHeight(root.left);//获取当前节点左孩子的高度
        int rightHeight = getHeight(root.right);//获取当前节点右孩子的高度
        return Math.max(leftHeight, rightHeight) + 1;//当前点的高度 = 左右孩子中更高的高度+1
    }
}

3.5找二叉树中两个节点的最近公共祖先

方法一:比较麻烦,空间复杂度较高,但比较好理解。

思路:1.创建一个map集合,先遍历所有节点,把每个节点的父节点存放在当前集合中。

map<当前节点,当前节点的父节点>

2.创建一个set集合,遍历当前节点1的所有祖先节点,并全部放入set集合中。

3.遍历节点2的所有祖先节点。每次遍历判断set集合中有没有当前节点,如果有,当前节点就是二者的共同祖先。由于都是从下网上遍历,所以第一个共同祖先就是最近共同祖先!

注意:这里方法一只提供一种思路,但空间复杂度和时间复杂度都较高,不推荐。

方法一代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        HashMap<TreeNode, TreeNode> map = new HashMap<>();
        map.put(root, root);//根节点的父节点就是自己
        f(root, map);
        HashSet<TreeNode> set = new HashSet<>();
        set.add(p);
        TreeNode cur = p;
        while (cur != root) {//从p网上遍历其所有的祖先,把p每一个祖先都存放在set集合中
            set.add(map.get(cur));
            cur = map.get(cur);//当前节点赋值为其父节点
        }
        set.add(root);//根节点单独放入set集合
        cur = q;
        while (cur != root) {//遍历q的所有祖先,把q每个祖先都和p的祖先比较,当出现第一个相同节点,就是二者最近共同的祖先
            if (set.contains(cur)) {
                return cur;
            }
            cur = map.get(cur);//当前节点赋值为其父节点
        }
        return root;
    }
    /**
     * 遍历树,把每个节点的父节点放入map集合中
     *
     * @param root 当前节点
     * @param map  存放节点关系的集合
     */
    public void f(TreeNode root, Map map) {
        if (root == null) {
            return;
        }
       map.put(root.left, root);
        map.put(root.right, root);
        f(root.left, map);
        f(root.right, map);
    }
}

方法二:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //对于这个方法。如果某个子树下p、q都没有,它一定返回的就是空!

        //遇到空就返回空,遇到p或q就返回p或q
        if(root == null || root == p || root == q) return root;
        TreeNode l = lowestCommonAncestor(root.left,p,q);//当前节点左子树的公共祖先
        TreeNode r = lowestCommonAncestor(root.right,p,q);//当前节点右子树的公共祖先
        if(l != null && r != null) return root;//如果当前节点的左右子树都有p或q。当前节点就是公共祖先
        return l == null ? r : l;//如果左孩子为空就返回右孩子,如果右孩子也是空,那就也返回空!
    }
}

两个节点的分布无非就两种情况:

1.o1、o2中某一个是另一个的祖先。

2.o1、o2两个点分布在某一个公共祖先的两边。

情况一的图:

return l == null ? r : l;

对于这种情况,A往左遍历,遍历到o1直接,就返回o1了。往右遍历,返回null。整体返回如果左不为空,就返回左,反之返回右。如果左右都为空,这返回右也就是返回空!

情况二的图:

if(l != null && r != null) return root;

对于节点B。就是这种情况,左右两边返回值都不为空,返回的就是当前节点B。而对于B上面的节点,另外一边没有o1或o2,返回的一定是空。因此对于B和null,上面节点往上返回的还是B!

3.6前缀树

class Trie {

    TrieNode root;

    public Trie() {
        root = new TrieNode();
    }

    class TrieNode{
        int pass;
        int end;
        HashMap<Character,TrieNode> nexts;
        public TrieNode(){
            pass = 0;
            end = 0;
            nexts = new HashMap<Character,TrieNode>();
        }
    }
    
    public void insert(String word) {
        if(word == null) return;
        char[] chars = word.toCharArray();
        root.pass++;
        TrieNode node = root;
        for(int i = 0; i < chars.length; i++){
            if(node.nexts.get(chars[i]) == null){//当前节点第一次被加入
                node.nexts.put(chars[i],new TrieNode());
            }
            node = node.nexts.get(chars[i]);
            node.pass++;
        }
        node.end++;
    }
    
    public boolean search(String word) {
        if(word == null) return true;
        char[] chars = word.toCharArray();
        TrieNode node = root;
        for(int i = 0; i < chars.length; i++){
            if(node.nexts.get(chars[i]) == null){//当前节点第一次被加入
                return false;
            }
            node = node.nexts.get(chars[i]);
        }
        if(node.end > 0) return true;
        return false;
    }
    
    public boolean startsWith(String prefix) {
        if(prefix == null) return true;
        char[] chars = prefix.toCharArray();
        TrieNode node = root;
        for(int i = 0; i < chars.length; i++){
            if(node.nexts.get(chars[i]) == null){//当前节点第一次被加入
                return false;
            }
            node = node.nexts.get(chars[i]);
        }
        return true;
    }
}

/**
 * Your Trie object will be instantiated and called as such:
 * Trie obj = new Trie();
 * obj.insert(word);
 * boolean param_2 = obj.search(word);
 * boolean param_3 = obj.startsWith(prefix);
 */

3.7.树中任意两个点之间的最大距离

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
     public int diameterOfBinaryTree(TreeNode root) {
        ResInfo process = process(root);
        return process.max - 1;
    }

    public ResInfo process(TreeNode root) {
        if (root == null) return new ResInfo(0, 0);
        //左右递归获取结果
        ResInfo left = process(root.left);
        ResInfo right = process(root.right);
        int t = left.height + right.height + 1;
        //当前点的最大距离为:
        //如果当前根节点不参与:1.左孩子中最大距离 2.右孩子中最大距离
        //当前点参与:3.左孩子最大高度 + 右孩子最大高度 + 1
        //从以上三种情况中求最大值,就是以当前点为根的任意两点之间的最大距离max
        int max = Math.max(Math.max(left.max, right.max), t);
        //求当前点的最大高度:左右高度更高的 + 1
        int height = Math.max(left.height, right.height) + 1;
        return new ResInfo(max, height);
    }


    class ResInfo {
        int max;//以当前点为根的任意两点之间的最大距离
        int height;//当前点的最大高度

        public ResInfo() {
        }

        public ResInfo(int max, int height) {
            this.max = max;
            this.height = height;
        }
    }

}

3.8.节点与其子树之间的最大差值

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
   public int maxAncestorDiff(TreeNode root) {
        resType process = process(root);
        return process.res;
    }

    public class resType {
        int max;//其子树中的最小值
        int min;//其子树中的最大值
        int res;//最大差值

        public resType() {
        }

        public resType(int max, int min, int res) {
            this.max = max;
            this.min = min;
            this.res = res;
        }
    }

    public resType process(TreeNode root) {
        if (root == null) return new resType(Integer.MIN_VALUE, Integer.MAX_VALUE, 0);
        if (root.left == null && root.right == null) {//如果遍历到叶子节点
            return new resType(root.val, root.val, 0);
        }
        //向左右子树要信息
        resType leftRes = process(root.left);
        resType rightRes = process(root.right);
       int max = Math.max(leftRes.max, Math.max(rightRes.max, root.val));//找到左右子树中最大的值
        int min = Math.min(leftRes.min, Math.min(rightRes.min, root.val));//找到左右子树中最小的值
        //最大差值由可能由三部分组成
        //左子树中的最大差值、右子树的最大差值
        //以及,当前点与左右子树最大最小值绝对值之差
        int res = Math.max(Math.abs(root.val - max), Math.abs(root.val - min));
        res = Math.max(res, Math.max(leftRes.res, rightRes.res));
        return new resType(max, min, res);
    }
}

3.9 二叉树的层平均值

这里注意的一点就是:每次循环队列长度就是该层的元素个数,这点需要注意一下。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        LinkedList<TreeNode> queue = new LinkedList<>();
        ArrayList<Double> res = new ArrayList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            //代表这一层元素的个数
            int size = queue.size();
            long sum = 0;
            //遍历这一层
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                sum += node.val;
                if (node.left != null) queue.add(node.left);
                if (node.right != null) queue.add(node.right);
            }
            res.add( ((double)sum / size));
        }
        return res;
    }
}

3.10.二叉树展开为链表

思路:

  1. 将左子树插入到右子树的地方
  2. 将原来的右子树接到左子树的最右边节点
  3. 考虑新的右子树的根节点,一直重复上边的过程,直到新的右子树为 null
    1
   / \
  2   5
 / \   \
3   4   6

//将 1 的左子树插入到右子树的地方
    1
     \
      2         5
     / \         \
    3   4         6        
//将原来的右子树接到左子树的最右边节点
    1
     \
      2          
     / \          
    3   4  
         \
          5
           \
            6
            
 //将 2 的左子树插入到右子树的地方
    1
     \
      2          
       \          
        3       4  
                 \
                  5
                   \
                    6   
        
 //将原来的右子树接到左子树的最右边节点
    1
     \
      2          
       \          
        3      
         \
          4  
           \
            5
             \
              6         
  
  ......
public void flatten(TreeNode root) {
    while (root != null) { 
        //左子树为 null,直接考虑下一个节点
        if (root.left == null) {
            root = root.right;
        } else {
            // 找左子树最右边的节点
            TreeNode pre = root.left;
            while (pre.right != null) {
                pre = pre.right;
            } 
            //将原来的右子树接到左子树的最右边节点
            pre.right = root.right;
            // 将左子树插入到右子树的地方
            root.right = root.left;
            root.left = null;
            // 考虑下一个节点
            root = root.right;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot Validation不生效该怎么办?

SpringBoot Validation不生效该怎么办&#xff1f; 确认maven依赖查看依赖关系并处理验证&#xff1a;校验生效&#xff0c;成功反思 能问出这个问题说明你已经使用了Null、NotEmpty等等等校验注解&#xff0c;但是没有生效&#xff0c;我也出现过这种情况&#xff0c;请看我修…

解析!文档扫描 SDK 中的高级图像处理技术

随着世界数字化&#xff0c;文档扫描已成为现代商业运营的关键&#xff0c;它使文档的存储、访问和管理更加便捷。然而&#xff0c;扫描图像的质量对于这些数字档案的有效性至关重要。高质量的扫描可确保文本清晰、数据准确捕获并且信息易于检索。 另一方面&#xff0c;质量差…

几乎跪着读完这本Transformer经典神书,震撼到爆!!

本书的目标是让您能够构建自己的语言应用程序。 涵盖了NLP中transformers的所有主要应用&#xff0c;每一章(除了少数例外)专门针对一个任务&#xff0c;结合一个实际的用例和数据集。每一章还介绍了一些额外的概念。 以下是我们将涉及的任务和主题的一个高级概述: 第一章&am…

学生护眼台灯哪个品牌比较好?性价比高的学生用台灯推荐

如今&#xff0c;随着近视在儿童中的普及率日益上升&#xff0c;这与学习压力以及频繁使用电子产品密切相关。一旦孩子患上近视&#xff0c;如果不注意用眼卫生&#xff0c;近视加深的速度会非常快&#xff0c;导致镜片越来越厚。因此&#xff0c;保持良好的用眼习惯对于预防近…

sass安装问题

首先直接安装 npm i sass 报错python&#xff0c;如上图 之后百度的方法&#xff0c;清除缓存再次安装&#xff08;删掉node_moudle&#xff09;,显示安装成功&#xff0c;但是运行还是会报错找不到sass模块 之后又百度了方法&#xff0c;要先安装cnpm&#xff0c;通过cnpm安装…

腾讯通用户必看:低成本平滑迁移方案,兼容Linux与移动端

一、腾讯通停更后用户面临的核心问题 自从腾讯通&#xff08;RTX&#xff09;停止更新并下架官网&#xff0c;许多用户失去了更新和技术支持的途径&#xff0c;同时不得不面对以下几大难题&#xff1a; 无法在移动端和Linux系统上使用&#xff1a;腾讯通仅支持Windows和Mac系…

HyperWorks实体网格划分

实体网格剖分 在 HyperMesh 中&#xff0c;使用 Solid Map 功能进行实体网格剖分。该面板如下图所示&#xff1a; 图 4-4 Solid Map 面板 通过 Solid Map Panel 进行实体网格剖分: • 通过主菜单栏选择 3D 页面 > solid map 。 • 通过下拉式菜单选择 Mesh > create…

移动剧院:流动艺术空间的声学革命—轻空间

在当今多元化的文化环境中&#xff0c;移动剧院作为一种新兴的演出形式&#xff0c;正在迅速崛起。它不仅提供了灵活多变的演出场地&#xff0c;更以其卓越的声学性能&#xff0c;为观众带来了沉浸式的视听体验。移动剧院的声学优势&#xff0c;使其成为各种艺术活动的理想选择…

基于丹摩云平台——Faster-RCNN 训练与测试指南

Faster-RCNN 训练与测试指南 前言 今天我们要来实现一个经典的目标检测模型&#xff1a;Faster-Rcnn。我们使用丹摩云平台来实现&#xff0c;这是个很强大的云端平台&#xff0c;功能众多&#xff0c;你可以投你所好去进行你想做的事情。 DAMODEL丹摩——专为AI打造的智算云…

力扣题解2306

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述&#xff08;困难&#xff09;&#xff1a; 公司命名 给你一个字符串数组 ideas 表示在公司命名过程中使用的名字列表。公司命名流程如下&#xff1a; 从 ideas 中选择 2 个 不同 名字&…

多校园信息付费发布顶置自定义表单小程序开源版开发

多校园信息付费发布顶置自定义表单小程序开源版开发 为校园管理和互动提供了强大的支持&#xff0c;包括用户端和运营后台两大部分。用户端允许学生和教职工方便地访问各种功能模块&#xff0c;而运营后台则使管理员能够高效地管理和配置系统。产品支持自定义模块和表单&#…

VSCode/VS2019#include头文件时找不到头文件:我的解决方法

0.前言 1.在学习了Linux之后&#xff0c;我平常大部分都使用本地的XShell或者VSCode连接远程云服务器写代码&#xff0c;CentOS的包管理器为我省去了不少繁琐的事情&#xff0c;今天使用vscode打开本地目录想写点代码发现#include头文件后&#xff0c;下方出现了波浪线&#…

批量发送邮件:性能优化与错误处理深度解析

目录 一、批量发送邮件的基础概述 1.1 批量发送邮件的定义 1.2 邮件发送流程 二、性能优化策略 2.1 发送速率控制 2.2 队列管理 2.3 动态IP池管理 2.4 智能调度 三、错误处理机制 3.1 暂时性发送错误处理 3.2 永久性发送错误处理 3.3 邮件反馈收集与分析 四、案例…

[C语言]--自定义类型: 结构体

目录 前言 一、结构体类型的声明 1.结构的声明 2.结构体变量的创建和初始化 3.结构的特殊声明 4.结构的自引用 二、结构体内存对齐 1.对齐规则 2.为什么存在内存对齐? 三、结构体传参 四、结构体实现位段 1.什么是位段 2.位段的内存分配 3.位段的跨平台问题 4.…

【JAVA开源】基于Vue和SpringBoot的影城管理系统

本文项目编号 T 045 &#xff0c;文末自助获取源码 \color{red}{T045&#xff0c;文末自助获取源码} T045&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 用…

通信工程高级职称评审条件详细解读

通信工程只有正高和副高级别的职称&#xff0c;中级通信工程的职称是需要自己参加考试的&#xff0c;并不是评审获得&#xff0c;这个大家需要注意一下&#xff0c;先要考取中级通信工程师之后才能评审副高和正高级通信工程的职称。 下面跟甘建二一起来看看通信专业职称评审条件…

C++ 9.24

作业一&#xff1a;将昨天的My_string类中的所有能重载的运算符全部进行重载、[] 、>、、<、、>、<、!、&#xff08;可以加等一个字符串&#xff0c;也可以加等一个字符&#xff09;、输入输出>>、<<。 main.cpp #include <iostream> #include…

华为昇腾系列-jupyter安装torch_npu

使用背景 国产算力的兴起&#xff0c;异构算力成为各大厂商的选择&#xff0c;以摆脱对英伟达算力过大的依赖&#xff0c;保障算力安全。本文将会讲解如何使用昇腾算力卡来制作一个镜像&#xff0c;然后交给k8s进行算力调度&#xff0c;显示国产算力的真正应用落地。 安装步骤…

微服务配置管理——动态路由

动态路由 网关的路由配置全部是在项目启动时由org.springframework.cloud.gateway.route.CompositeRouteDefinitionLocator在项目启动的时候加载&#xff0c;并且一经加载就会缓存到内存中的路由表内&#xff08;一个Map&#xff09;&#xff0c;不会改变。也不会监听路由变更新…

创建游戏暂停菜单

创建用户控件 设置样式 , 加一层 背景模糊 提升UI菜单界面质感 , 按钮用 灰色调 编写菜单逻辑 转到第三人称蓝图 推荐用 Set Input Mode Game And UI , 只用仅UI的话 增强输入响应不了 让游戏暂停的话也可以用 Set Game Paused , 打勾就是暂停 , 不打勾就是继续游戏 , 然后…