【算法练习】leetcode算法题合集之二叉树篇

递归遍历基础篇

前序遍历,中序遍历,后序遍历是根据处理根节点的位置来命名的。

树的处理大多用到了递归,递归需要知道终止条件。

前序遍历(中左右)

144.二叉树的前序遍历

中左右,先处理根节点,再处理左子树,再处理右子树

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        preOrder(res, root);
        return res;
    }

    private void preOrder(List<Integer> res, TreeNode root) {
        if(root==null){
            return;
        }
        res.add(root.val);
        preOrder(res, root.left);
        preOrder(res, root.right);
    }
}

非递归版实现前序遍历

使用栈,当前节点处理完,先塞入右节点(后处理),再塞入左节点。

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        //右左
        stack.add(root);
        while (!stack.isEmpty()) {
            TreeNode pop = stack.pop();
            res.add(pop.val);
            if (pop.right != null) {
                stack.push(pop.right);
            }
            if (pop.left != null) {
                stack.push(pop.left);
            }

        }
        return res;
    }
}

中序遍历(左中右)

94.二叉树的中序遍历

递归方式

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        inOrder(res, root);
        return res;
    }

    private void inOrder(List<Integer> res, TreeNode root) {
        if (root == null) {
            return;
        }

        inOrder(res, root.left);
        res.add(root.val);
        inOrder(res, root.right);
    }
}

非递归,左中右,先找到最左节点,处理当前节点,处理右节点。把最左边的节点都压入栈中。

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !stack.isEmpty()) {
            if (cur != null) {
                stack.push(cur);
                cur = cur.left;
            } else {
                TreeNode pop = stack.pop();
                res.add(pop.val);
                cur = pop.right;
            }
        }
        return res;
    }

后序遍历(左右中)

145.二叉树的后序遍历

递归方式

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        postOrder(res, root);
        return res;

    }


    public void postOrder(List<Integer> res, TreeNode root) {
        if (root == null) {
            return;
        }
        postOrder(res,root.left);
        postOrder(res,root.right);
        res.add(root.val);
    }
}

非递归方式,左右中的逆序是中右左,处理可以参考前序遍历,最后进行倒序。

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode pop = stack.pop();
            res.add(pop.val);
            if(pop.left!=null){
                stack.push(pop.left);
            }
            if(pop.right!=null){
                stack.push(pop.right);
            }
        }
        Collections.reverse(res);
        return res;

    }

}

层序遍历

LeetCode199.二叉树的右视图

LeetCode199.二叉树的右视图

获取当前行的最后一个元素。

class Solution_LC199 {
    public List<Integer> rightSideView(TreeNode root) {

        List<Integer> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            while (size > 0) {
                size--;
                TreeNode node = queue.poll();
                if (size == 0) {
                    res.add(node.val);
                }
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
        }
        return res;

    }
}

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

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

对树进行判空

获取当前行的元素,需要获取队列的大小。

class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int index = 0;
        while (!queue.isEmpty()) {
            index++;
            LinkedList<Integer> list = new LinkedList<>();
            int size = queue.size();
            while (size > 0) {
                size--;
                TreeNode node = queue.poll();
                if (index % 2 == 0) {
                    list.addFirst(node.val);
                } else {
                    list.addLast(node.val);
                }

                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
            res.add(list);

        }
        return res;
    }

}

剑指 Offer II 044. 二叉树每层的最大值

剑指 Offer II 044. 二叉树每层的最大值

原理同上。

class Solution_JZ044 {
    public List<Integer> largestValues(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            int max = Integer.MIN_VALUE;
            while (size > 0) {
                size--;
                TreeNode node = queue.poll();
                if (node.val > max) {
                    max = node.val;
                }
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }

            }
            res.add(max);
        }
        return res;
    }
}

Leetcode101. 对称二叉树

Leetcode101. 对称二叉树

递归

比较最左边和最右边的元素。

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }
        return dfs(root.left, root.right);

    }

    private boolean dfs(TreeNode left, TreeNode right) {
        if (left == null && right == null) {
            return true;
        }
        if (left == null || right == null) {
            return false;
        }
        if (left.val != right.val) {
            return false;
        }
        return dfs(left.left, right.right) && dfs(right.left, left.right);
    }
}

使用队列

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null || (root.left == null && root.right == null)) {
            return true;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root.left);
        queue.offer(root.right);
        while (!queue.isEmpty()) {
            TreeNode left = queue.poll();
            TreeNode right = queue.poll();
            if (left == null && right == null) {
                continue;
            }
            if (left == null || right == null) {
                return false;
            }
            if (left.val != right.val) {
                return false;
            }
            queue.offer(left.left);
            queue.offer(right.right);
            queue.offer(right.left);
            queue.offer(left.right);
        }
        return true;

    }
}

前序遍历

LeetCode257.二叉树的所有路径

LeetCode257: 二叉树的所有路径

结束条件:该节点是叶子节点,结果集添加path

如何添加连接字符->

class Solution {
    List<String> res = new ArrayList<>();

    public List<String> binaryTreePaths(TreeNode root) {
        dfs(root, "");
        return res;
    }

    private void dfs(TreeNode root, String s) {
        if (root == null) {
            return;
        }
        s = s + root.val;
        if (root.left == null && root.right == null) {
            res.add(s);
        }else {
            dfs(root.left, s + "->");
            dfs(root.right, s + "->");
        }
    }
}

LeetCode129.求根到叶子节点数字之和

LeetCode 129.求根到叶子节点数字之和

按照上题的思路来,先把结果添加到集合里面。

class Solution {

    List<Integer> res = new ArrayList<>();

    public int sumNumbers(TreeNode root) {
        if (root == null) {
            return 0;
        }
        dfs(root, 0);
        int sum = 0;
        for (int i = 0; i < res.size(); i++) {
            sum += res.get(i);
        }
        return sum;

    }

    private void dfs(TreeNode root, int num) {
        if (root == null) {
            return;
        }
        num = num * 10 + root.val;
        if (root.left == null && root.right == null) {
            res.add(num);
        } else {
            dfs(root.left, num);
            dfs(root.right, num);
        }
    }
}

递归,当前节点的结果等于左子树操作+右子树操作

class Solution {
    List<Integer> res = new ArrayList<>();

    public int sumNumbers(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return dfs2(root, 0);

    }

    private int dfs2(TreeNode root, int pre) {
        if (root == null) {
            return 0;
        }
        int sum = pre * 10 + root.val;
        if (root.left == null && root.right == null) {
            return sum;
        }
        return dfs2(root.right, sum) + dfs2(root.left, sum);
    }
}

LeetCode112.路径总和

112. 路径总和

不断累加值,判断是否和目标值相等

class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {

        return dfs(root, targetSum, 0);
    }

    private boolean dfs(TreeNode root, int targetSum, int pre) {
        if (root == null) {
            return false;
        }
        if (root.left == null && root.right == null) {
            return pre + root.val == targetSum;
        } else {
            return dfs(root.left, targetSum, pre + root.val) || dfs(root.right, targetSum, pre + root.val);
        }

    }
}

更新目标值

class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {

        if (root == null) {
            return false;
        }
        if (root.left == null && root.right == null) {
            return targetSum == root.val;
        }
        return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val);
    }
}

LeetCode113.路径总和II

113. 路径总和 II

用队列记录当前路径下的元素,方便回退。

class Solution {
    List<List<Integer>> res = new LinkedList<>();

    LinkedList<Integer> queue = new LinkedList<>();

    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        dfs(root,targetSum );
        return res;
    }

    private void dfs(TreeNode root, int targetSum) {
        if (root == null) {
            return;
        }
        targetSum -= root.val;
        queue.offer(root.val);
        if (root.left == null && root.right == null && targetSum == 0) {
            res.add(new ArrayList<>(queue));
        } else {
            dfs(root.left,  targetSum);
            dfs(root.right,  targetSum);
        }
        queue.pollLast();

    }
}

LeetCode437.路径总和 III(**)

LeetCode437. 路径总和 III

定义一个以某节点为开始节点获取路径总和为targetSum的方法。

不一定是叶子节点

用long代替int,因为有测试用例减溢出。

class Solution {
    public int pathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return 0;
        }
        int res = rootSum(root, targetSum);
        return res + pathSum(root.left, targetSum) + pathSum(root.right, targetSum);
    }

    private int rootSum(TreeNode root, long targetSum) {
        int ret = 0;
        if (root == null) {
            return 0;
        }
        if (targetSum == root.val) {
            ret++;
        }
        return ret + rootSum(root.left, targetSum - root.val) + rootSum(root.right, targetSum - root.val);
    }
}

中序遍历

LeetCode98.验证二叉搜索树

LeetCode98.验证二叉搜索树

左子树上的节点都小于根节点,右子树上的值都大于根节点。

递归。

class Solution {
    public boolean isValidBST(TreeNode root) {
        return isValidBST(root, Long.MAX_VALUE, Long.MIN_VALUE);
    }

    private boolean isValidBST(TreeNode root, long maxValue, long minValue) {
        if (root == null) {
            return true;
        }
        if (root.val >= maxValue || root.val <= minValue) {
            return false;
        }
        return isValidBST(root.left, root.val, minValue) && isValidBST(root.right, maxValue, root.val);
    }
}

中序遍历

中序遍历 ,先左再中后右,左<中<右

比较数组是否有序,用tmp来缓存最小元素。

class Solution {
    public boolean isValidBST(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        long tmp = Long.MIN_VALUE;
        TreeNode cur = root;
        while (!stack.isEmpty() || cur != null) {
            if (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }else {
                cur = stack.pop();
                if (cur.val <= tmp) {
                    return false;
                }
                tmp = cur.val;
                cur = cur.right;
            }
        }
        return true;
    }
}

剑指 Offer 54. 二叉搜索树的第k大节点

剑指 Offer 54. 二叉搜索树的第k大节点.

第n大,就是数组中第n-k个元素。第2大的元素逆序在索引1的位置。

右中左,即中序遍历的数组的倒序。

class Solution_LCR174 {
    int res;
    int index = 0;

    public int findTargetNode(TreeNode root, int cnt) {
        dfs(root, cnt);
        return res;
    }

    private void dfs(TreeNode root, int cnt) {
        if (root == null) {
            return;
        }
        dfs(root.right, cnt);
        index++;
        if (index == cnt) {
            res = root.val;
        }
        dfs(root.left, cnt);
    }
}

Leetcode230. 二叉搜索树中第K小的元素

Leetcode230. 二叉搜索树中第K小的元素

同上,不需要倒序,更简单

class Solution {
    int k;
    int res;
    int index = 0;


    public int kthSmallest(TreeNode root, int k) {
        this.k = k;
        dfs(root);
        return res;

    }

    private void dfs(TreeNode root) {
        if (root == null) {
            return;
        }
        dfs(root.left);
        index++;
        if (index == k) {
            res = root.val;
        }
        dfs(root.right);
    }
}

剑指offer36: 二叉搜索树与双向链表(*)

剑指offer36: 二叉搜索树与双向链表

pre节点是前节点,获取最左边的节点为pre节点。不断更新pre节点。

核心还是中序遍历。

class Solution {
    Node pre = null, head = null;

    public Node treeToDoublyList(Node root) {
        if (root == null) return root;
        dfs(root);
        head.left = pre;
        pre.right = head;
        return head;
    }

    void dfs(Node root) {
        if (root == null) {
            return;
        }
        dfs(root.left);
        if (pre != null) {
            pre.right = root;
        } else {
            head = root;
        }
        root.left = pre;
        pre = root;
        dfs(root.right);
    }
}

Leetcode.538. 把二叉搜索树转换为累加树(*)

Leetcode.538. 把二叉搜索树转换为累加树.

理解题意,原先是二叉搜索树,当先不一定是二叉搜索树。当前节点为原有树的大于等于当前节点(当前节点和所有右子树节点)的和。

class Solution {
    int sum = 0;

    public TreeNode convertBST(TreeNode root) {
        if (root == null) {
            return null;
        }
        convertBST(root.right);
        sum += root.val;
        root.val = sum;
        convertBST(root.left);
        return root;
    }
}

后序遍历

Leetcode104. 二叉树的最大深度

Leetcode104. 二叉树的最大深度

方法一:递归(后续遍历,左右中)

方法二:层序遍历

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        } else {
            return Math.max(maxDepth(root.right), maxDepth(root.left)) + 1;
        }
    }
}

LeetCode226. 翻转二叉树

LeetCode226. 翻转二叉树

要暂存左边的树

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }

        TreeNode left = invertTree(root.left);
        TreeNode right = invertTree(root.right);

        root.right = left;
        root.left = right;
        return root;
    }
}

Leetcode110. 判断是否是平衡二叉树

Leetcode110. 判断是否平衡二叉树

求深度的扩展

class Solution {
    public boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true;
        }
        return Math.abs(getDepth(root.left) - getDepth(root.right)) <= 1 & isBalanced(root.left)
                && isBalanced(root.right);
    }

    private int getDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return 1 + Math.max(getDepth(root.right), getDepth(root.left));
    }
}

LeetCode543.二叉树的直径

LeetCode543.二叉树的直径

结果最大的数据不一定是根节点。

每一个节点的对应的直径等于左子树的深度+右子树的深度。

class Solution {
    int ans;

    public int diameterOfBinaryTree(TreeNode root) {
        if (root == null) {
            return 0;
        }
        depth(root);
        return ans;
    }

    private int depth(TreeNode root) {

        if (root == null) {
            return 0;
        }
        int left = depth(root.left);
        int right = depth(root.right);
        ans = Math.max(ans, right + left);
        return 1 + Math.max(left, right);
    }
}

LeetCode124.二叉树中的最大路径和

LeetCode124.二叉树中的最大路径和

计算以某节点为起点,最长的路径。路径和=左最大路径+右最大路径+当前节点的值。

如果该路径大于0,则选;否则不选。

class Solution {
    int ans = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        maxGain(root);
        return ans;
    }

    public int maxGain(TreeNode node) {
        if (node == null) {
            return 0;
        }
        int left = Math.max(maxGain(node.left), 0);
        int right = Math.max(maxGain(node.right), 0);
        ans = Math.max(ans, node.val + left + right);
        return node.val + Math.max(left, right);
    }
}

Leetcode236. 二叉树的最近公共祖先(**)

Leetcode236. 二叉树的最近公共祖先

左子树能找到,两个节点都在左边;左右子树都找到,返回root;左右子树都找不到,返回

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null || p == root || q == root) {
            return root;
        }
        TreeNode leftNode = lowestCommonAncestor(root.left, p, q);
        TreeNode rightNode = lowestCommonAncestor(root.right, p, q);
        if (leftNode == null && rightNode == null) {
            return null;
        }
        if (leftNode == null) {
            return rightNode;
        }
        if (rightNode == null) {
            return leftNode;
        }
        return root;

    }
}

二叉搜索树

Leetcode235. 二叉搜索树的最近公共祖先

Leetcode235. 二叉搜索树的最近公共祖先

遍历树的元素

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        while (true) {
            if (root.val > p.val && root.val > q.val) {
                root = root.left;
            } else if (root.val < p.val && root.val < q.val) {
                root = root.right;
            } else {
                break;
            }
        }
        return root;
    }
}

剑指offer33: 验证二叉搜索树的后序遍历序列

验证二叉搜索树的后序遍历序列

后续遍历是左右中的结构,最后一个元素是root

序列中第一个元素大于root元素,该元素及以后是右子树的序列。

最后一个元素是根元素,不是右子树的一部分。

class Solution {
    public boolean verifyTreeOrder(int[] postorder) {
        // 左右中
        return dfs(postorder, 0, postorder.length - 1);

    }

    private boolean dfs(int[] postorder, int left, int right) {
        if (left >= right) {
            return true;
        }
        int tmp = left;
        int root = postorder[right];
        while (tmp < right && postorder[tmp] < root) {
            tmp++;
        }
        int mid = tmp;
        while (tmp < right) {
            if (postorder[tmp] < root) {
                return false;
            }
            tmp++;
        }
        return dfs(postorder, left, mid - 1) && dfs(postorder, mid, right - 1);

    }
}

二叉树的修改构造

LeetCode105.从前序和中序遍历构造二叉树

LeetCode105.从前序和中序遍历构造二叉树

前序 中左右 中序 左中右

分割中序遍历的序列,获取到左子树的长度和右子树的长度。

对数组的操作,要么是拷贝数组,要么是指定索引。

class Solution {
    Map<Integer, Integer> map = new HashMap<>();

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        
        for (int i = 0; i < inorder.length; i++) {
            map.put(inorder[i], i);
        }

        return buildTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);

    }

    private TreeNode buildTree(int[] preorder, int preLeft, int preRight, int[] inorder, int inLeft, int inRight) {
        if (preRight < preLeft || inRight < inLeft) {
            return null;
        }
        int rootIndex = map.get(preorder[preLeft]);
        TreeNode root = new TreeNode(preorder[preLeft]);
        int leftLength = rootIndex - inLeft;


        root.left = buildTree(preorder, preLeft + 1, preLeft + leftLength, inorder, inLeft, rootIndex);
        root.right = buildTree(preorder, preLeft + leftLength + 1, preRight, inorder, rootIndex + 1, inRight);
        return root;
    }
}

Leetcode 297.二叉树的序列化与反序列化

Leetcode 297.二叉树的序列化与反序列化

使用先序遍历来构成数组,数组转换成树。

public class Codec {

    public String serialize(TreeNode root) {

        return rserialize(root, "");
    }

    private String rserialize(TreeNode root, String s) {
        if (root == null) {
            s += "NONE,";

        } else {
            s += root.val + ",";
            s = rserialize(root.left, s);
            s = rserialize(root.right, s);
        }
        return s;
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        String[] dataList = data.split(",");
        return rdeserialize(new ArrayList(Arrays.asList(dataList)));
    }

    private TreeNode rdeserialize(List<String> dataList) {
        if (dataList.get(0).equals("NONE")) {
            dataList.remove(0);
            return null;
        }
        TreeNode root = new TreeNode(Integer.valueOf(dataList.get(0)));
        dataList.remove(0);
        root.left = rdeserialize(dataList);
        root.right = rdeserialize(dataList);
        return root;

    }
}

二叉树的递归思维

LeetCode572.另一个树的子树

LeetCode572.另一个树的子树

简化成两棵树是否相等

class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if (root == null) {
            return false;
        }
        return isSameTree(root, subRoot) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);

    }

    public boolean isSameTree(TreeNode s, TreeNode t) {
        if (s == null && t == null) {
            return true;
        }
        if (s == null || t == null || s.val != t.val) {
            return false;
        }
        return isSameTree(s.left, t.left) && isSameTree(s.right, t.right);
    }
}

其他

LeetCode114. 二叉树展开为链表

比较简单的方法就是先序遍历元素。

class Solution {
    List<TreeNode> list = new ArrayList<>();

    public void flatten(TreeNode root) {

        dfs(root);
        for (int i = 1; i < list.size(); i++) {
            TreeNode prev = list.get(i - 1), cur = list.get(i);
            prev.left = null;
            prev.right = cur;
        }
    }

    private void dfs(TreeNode root) {
        if (root == null) {
            return;
        }
        list.add(root);
        dfs(root.left);
        dfs(root.right);

    }
}

把右节点放在左节点的最右节点的右边,把左节点放在右边,这样顺序是正确的。

class Solution {

    public void flatten(TreeNode root) {

        TreeNode cur = root;
        while (cur != null) {
            TreeNode left = cur.left;
            if (left != null) {
                TreeNode tmp = left;
                while (tmp.right != null) {
                    tmp = tmp.right;
                }
                tmp.right = cur.right;
                cur.left = null;
                cur.right = left;

            }
            cur = cur.right;
        }
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ASP .net core微服务实战

>>>>>>>>>>>>>>开发<<<<<<<<<<<<<<<< 0)用户 用户到nginx之间需要用https&#xff0c;避免被监听。 1)nginx // 做统一的分发&#xff0c;到微服务&#xff0c;相当于网关,提供统…

异常处理:全面覆盖与精细化管理的平衡

异常处理&#xff1a;全面覆盖与精细化管理的平衡 在软件开发中&#xff0c;异常处理是保证系统稳定性和用户体验的重要环节。对于是否应当全面覆盖所有异常并设立兜底机制&#xff0c;业界存在着两种主流思路&#xff1a;全面覆盖原则和精细化处理。如何在这两者间取得平衡&a…

Unity文字转语音(使用RT-Voice PRO [2023.1.0])

参考文章Unity插件——文字转朗读语音RtVioce插件功能/用法/下载_rtvoice-CSDN博客 一、使用步骤 1.导入进Unity&#xff08;插件形式为 .unitypackage&#xff09; https://download.csdn.net/download/luckydog1120446388/88717512 2.添加所需Prefab 1&#xff09;.右键可…

【科技素养题】少儿编程 蓝桥杯青少组科技素养题真题及解析第22套

少儿编程 蓝桥杯青少组科技素养题真题及解析第22套 1、植物的叶子多为绿色,这主要是因为它们含有 A、绿色色素 B、叶绿素 C、花青素 D、细胞 答案:B 考点分析:主要考查小朋友们生物知识的储备;叶绿素是植物叶子中的一种色素,它可以吸收太阳光中的能量并转化为植物所…

【深度学习:Domain Adversarial Neural Networks (DANN) 】领域对抗神经网络简介

【深度学习&#xff1a;Domain Adversarial Neural Networks】领域对抗神经网络简介 前言领域对抗神经网络DANN 模型架构DANN 训练流程DANN示例 GPT示例 前言 领域适应&#xff08;DA&#xff09;指的是当不同数据集的输入分布发生变化&#xff08;这种变化通常被称为共变量变…

synchronized和lock的区别

synchronized和lock的区别 1&#xff09;synchronized是一个关键字&#xff0c;lock是一个java类&#xff1b; 2&#xff09;synchronized无法判断获取锁的状态&#xff0c;lock可以判断是否获取到了锁&#xff1b; 3&#xff09;synchronized会自动释放锁&#xff0c;lock必须…

《罗素论教育》笔记

目录 全书架构 书简介 经典摘录 一、教育的理想 教育的基本原理 教育的目的 二、品性的教育 一岁前的教育 主要是2岁到6岁的教育 三、智力教育 14岁前的课程安排 最后的学年 大学教育 四、结束语 全书架构 书简介 经典摘录 一、教育的理想 教育的基本原理 1、我…

Python从入门到网络爬虫(读写Excel详解)

前言 Python操作Excel的模块有很多&#xff0c;并且各有优劣&#xff0c;不同模块支持的操作和文件类型也有不同。最常用的Excel处理库有xlrd、xlwt、xlutils、xlwings、openpyxl、pandas&#xff0c;下面是各个模块的支持情况&#xff1a; 工具名称.xls.xlsx获取文件内容写入…

LitJson-Json字符串转对像时:整型与字符串或字符串转:整型进的类型不一致的处理

目录 问题描述上代码测试代码各位看官&#xff0c;打赏个1元吧 Json数据格式是大家在游戏开中常量用的一种数据格式&#xff0c;某种程度上可以说是必备的。对unity开发来说&#xff0c;LitJson这个json库应该是被使用最多的json库了。 问题描述 今天说要的其中的这个api: Jso…

2024年中国电子学会青少年编程等级考试安排的通知

各有关单位、全体考生: 中国电子学会青少年等级考试&#xff08;以下简称等级考试&#xff09;是中国电子学会为落实《全民科学素质行动规划纲要》&#xff0c;提升青少年电子信息科学素质水平而开展的社会化评价项目。等级考试自2011年启动以来&#xff0c;作为中国电子学会科…

AGV用120°激光扫描避障雷达传感器DE系列功能与通道切换操作说明

AGV用120激光扫描避障雷达传感器DE系列&#xff0c;包含DE-4211、DE-4611、DE-4311、DE-4511等型号&#xff0c;可帮助AGV/AMR/机器人快速精准地检测障碍物&#xff0c;确保系统运行安全&#xff0c;帮助智能停车系统完成准确的数据判定&#xff0c;实现车位或充电桩占用检测等…

Linux 期末复习

Linux 期末复习 计算机历史 硬件基础 1&#xff0c;计算机硬件的五大部件&#xff1a;控制器、运算器、存储器、输入输出设备 2&#xff0c;cpu分为精简指令集(RISC)和复杂指令集(CISC) 3&#xff0c;硬件只认识0和1&#xff0c;最小单位是bit&#xff0c;最小存储单位是字…

【设计模式】一文理解记住设计模式的原则

目录——阅读所需预计5-10分钟 &#x1f396;️前言&#x1f3af;单一职责原则&#x1f4e3;1. 定义&#x1f49e;2. 定义很抽象&#xff0c;咱继续看&#x1f389;3. 举几个栗子&#x1f49e;4. 以上栗子出现了一个问题&#xff0c;单一职责的划分究竟可以分多细&#x1f449;…

掌握Lazada API接口:开启电商开发新篇章,引领业务增长潮流

一、概述 Lazada API接口是Lazada平台提供的软件开发工具包&#xff0c;它允许第三方开发者通过编程方式访问Lazada平台上的商品、订单、用户等数据&#xff0c;并执行相关操作。通过使用Lazada API接口&#xff0c;开发者可以快速构建与Lazada平台集成的应用程序&#xff0c;…

Ubuntu 18.04.5 LTS 解决安装包复杂依赖相关问题解决的主要法则和VIM的安装实录

前言&#xff1a;目标和环境 环境&#xff1a; Ubuntu 18.04.5 LTSVMware 目标&#xff1a; 安装vim&#xff0c;解决包依赖的冲突&#xff1a; 本文&#xff0c;通过一个很好的实例&#xff0c;诠释了&#xff0c;LINUX系统下&#xff0c;安装一个应用遇到的依赖库问题如何…

单片机原理及应用:中断系统结构与控制寄存器

大家好啊&#xff0c;这几天因为考试断更了一段时间&#xff0c;现在放假了也可以恢复正常的更新速度了。今天我们来认识一下单片机的中断系统&#xff0c;这里可以说是我们学习单片机以来第一个核心功能&#xff0c;我们会分几期内容来深入了解中断系统的作用原理和应用方式。…

【K8S 云原生】Kurbernets集群的调度策略

目录 一、Kubernetes的list-watch机制 1、List-watch 2、创建pod的过程&#xff1a; 二、scheduler调度的过程和策略&#xff1a; 1、简介 2、预算策略&#xff1a;predicate 3、优先策略&#xff1a; 3.1、leastrequestedpriority&#xff1a; 3.2、balanceresourceal…

linux 系统安全及应用

一、账号安全基本措施 1.系统账号清理 1.将用户设置为无法登录 /sbin/nologin shell——/sbin/nologin却比较特殊&#xff0c;所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已&#xff0c;并不是说这个账号就无法使用系统资源。举例来说&#xff0c;…

MySQL语法练习-DML语法练习

文章目录 0、相关文章1、添加数据2、修改数据3、删除数据4、总结 0、相关文章 《MySQL练习-DDL语法练习》 1、添加数据 # 给指定字段添加数据 insert into 表名 (字段名1,字段名2,...) values(值1,值2...);# 给全部字段添加数据 insert into 表名 values(值1,值2,...);#批量…

Mac robotframework+pycharm运行suite报错情况:ImportError: No module named request

报错实例&#xff1a; 当前Preferences–>Tool–>External Tools Suite配置&#xff0c;显示使用的python为2.7版本&#xff0c;robotframework安装在当前版本的python中&#xff1a; 但是我pycharm现在的环境配置的python为3.11&#xff0c;当前使用的RF与当前使用的py…