算法通过村第六关-树白银笔记|层次遍历

文章目录

  • 前言
  • 1. 层次遍历介绍
  • 2. 基本的层次遍历与变换
    • 2.1 二叉树的层次遍历
    • 2.2 层次遍历-自底向上
    • 2.3 二叉树的锯齿形层次遍历
    • 2.4 N叉树的层次遍历
  • 3. 几个处理每层元素的题目
    • 3.1 在每棵树行中找出最大值
    • 3.2 在每棵树行中找出平均值
    • 3.3 二叉树的右视图
    • 3.4 最底层最左边
  • 总结


前言


提示:这个世界上的任何一次拥抱都是将以松手告终。 --约瑟夫·布罗茨基《悲伤与理智》

二叉树的层次遍历是一个非常简单的问题,但是很多人没有接触过,所以就认为很难,面试的时候当然就写不出来了,今天我们就重点通关层次遍历这个问题。

1. 层次遍历介绍

广度优先在面试中属于常考类型,整体来说属于简单次,但是很多人面试遇到了就放弃,真的很可惜。我们就看看它的难度在哪里。

广度优先又叫做层次遍历,基本过程如下:
在这里插入图片描述
层次遍历就是从根节点开始,先访问根节点的一层全部元素,在访问之后的一层,类似金字塔一样一层一层访问。我们可以看做就是从左到右的一层一层去遍历二叉树,先访问5,之后访问3的左右孩子4 和 6 ,之后再访问4 和 6的孩子1 2 和 7 8。最后得到结果【5,4,6,1,2,7,8】

这里的问题就变成了将遍历过的子孩子保存下来,比如访问4 的左右孩子1 和 2 的时候应该先存储,直到处理完20之后再处理。使用队列的话就可以解决上述问题。

看下过程图解:

  1. 根节点入队 5
  2. 然后 5 出队, 之后将 5 的左右孩子4 6入队,保存在队列中
  3. 4 出队,将4 的左右孩子 1 2 入队
  4. 之后 6 出队,将 6 的左右孩子 7 8 入队,保存在队列中
  5. 最终 1 2 7 8 依次出队,此时都是叶子几点,只要出队就行了。

这个过程不复杂,如果将树的每层分开,是不是可以整活😎了?首先,能否将每层的元素顺序反转一下?或者说奇数不变,偶数反转?是否将输出层次从低到高(root)输出呢?再比如,既然可以拿到每层的元素,能不能找到当前层最大的元素?最小的元素呢?最右端的元素(右视图)?最左端的元素(左视图)?整个层的平均值?当然这都是可以实现的嘞😋,这么来回折腾有啥用呢?🤔,没啥用了,但是这些都是层次遍历的高频算法题目。

推荐力扣题目⭐⭐⭐⭐:

102. 二叉树的层序遍历 - 力扣(LeetCode)

107. 二叉树的层序遍历 II - 力扣(LeetCode)

199. 二叉树的右视图 - 力扣(LeetCode)

637. 二叉树的层平均值 - 力扣(LeetCode)

429. N 叉树的层序遍历 - 力扣(LeetCode)

515. 在每个树行中找最大值 - 力扣(LeetCode)

116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode)

117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode)

103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)

2. 基本的层次遍历与变换

我们看一个最简单的情况,仅仅是遍历并输出全部元素,如下图:
在这里插入图片描述
上图的输入结果【5,4,6,7,8】,方法已经梳理过了,这里看一下代码怎么实现。先访问根节点,然后其左右孩子入队,接着出队,出队的元素将其左右孩子入队,直到队列为空就可以退出了:

	/*** 二叉树层序遍历* @param root* @return*/public static List<Integer> simpleLevelOrder(TreeNode root) {// 参数校验if (root == null) {return new ArrayList<Integer>();}// 创建存储空间List<Integer> res = new ArrayList<Integer>();LinkedList<TreeNode> queue = new LinkedList<TreeNode>();// 根节点先入队queue.add(root);// 遍历队列元素while(queue.size() > 0){// 获取当前队列的长度,这个长度相当于这一层的节点个数TreeNode t = queue.remove();res.add(t.val);if (t.left != null){queue.add(t.left);}if (t.right != null){queue.add(t.right);}}return  res;}

注意:

根据树的结构可以看出,一个节点在一层访问之后,其子孩子都是在下层按照FIFO的顺序处理的,因此队列在这里起到了一个缓存的作用。

如果要你将每层的元素分开该怎么做呢?看下下面的这个题:

2.1 二叉树的层次遍历

题目介绍:102. 二叉树的层序遍历 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述
我们再来看这个执行过程,我们先将根节点放入队列中,然后不断的遍历队列。
在这里插入图片描述
那如何判断某一层访问完了呢?这个简单,我们用一个size标记一下就行了,size表示某一层元素的个数,知道出队,size就减1,减到0就说明该层访问完了,当size变成0之后,这时队列中甚于元素个数恰好就是下一次的个数,因此重新将size标记为下一层的元素个数就可以继续处理新的一行,例如上面的序列中:

  1. 首先获取根节点 3 ,左右子节点不为空,将左右子节点放入队列,此时3 已经出队。剩下的9 20 恰好是第二层的所有节点,此时size = 2
  2. 继续将9 出队,左右节点不为空,将左右节点放入队列,size-- ,变成 1 ,之后将20 出队,左右节点不为空,将左右节点放入队列 size–, 变为 0。当size = 0,说明当前层已经处理完了,此时队列有4个元素,恰好是下一层的元素个数。
  3. 最后,我们把每层遍历到的节点放入一个结果集中,将其返回就可以了

按层次遍历经典代码:

	/*** 层次遍历  经典方式* @param root* @return*/public static List<List<Integer>> level102Order(TreeNode root) {// 校验参数if (root == null){return new ArrayList<List<Integer>>();}// 创建空间List<List<Integer>> res = new ArrayList<List<Integer>>();LinkedList<TreeNode> queue = new LinkedList<TreeNode>();// 将根节点放入队列  然后不断遍历队列queue.add(root);while(queue.size() > 0){// 获取当前size的个数  即当前层有多少个元素int size = queue.size();// 创建临时空间  将一层的元素存入其中List<Integer> temp = new ArrayList<Integer>();for(int i = 0; i < size; i++){TreeNode t = queue.remove();temp.add(t.val);if (t.left != null){queue.add(t.left);}if (t.right != null){queue.add(t.right);}}// 此时的temp就是一层的所有元素,用list类型保存temp,最后加入到结果集中res.add(temp);}return res;}

此方法一定要牢记,在算法体系中是很重要的一环,他与链表反转,二分查找可以相提并论,务必掌握,彻底理解,然后记忆。

当然上面的算法理解了,下面的一系列题目都变得简单了,不信你往下看。

注意:

在Java中队列的实现不止一种,需要注意。

2.2 层次遍历-自底向上

题目介绍:107. 二叉树的层序遍历 II - 力扣(LeetCode)
在这里插入图片描述
在这里插入图片描述
如果要求从上到下输出每一层的节点值,做法很直观,在遍历完一层之后,将该层存储节点值的列表添加到结果集的尾部。这道题要求从下到上输出每一层的节点值,只要对上述操作稍作修改就可以了,在遍历完一层节点后,将存储该层节点值的列表添加到结果集的头部。

为了降低在结果列表的头部添加一层节点值的列表的时间复杂度,结果列表可以使用链表的结构,在链表头部添加一层节点值的列表的时间复杂度为O(1),在Java中,由于我们需要返回一个List接口,在这里可以使用链表实现。

代码就很普通了😎:

	/*** 层序遍历  自底向上* @param root* @return*/public static List<List<Integer>> levelOrderBottom(TreeNode root) {// 校验参数if (root == null){return new ArrayList<List<Integer>>();}// 创建空间List<List<Integer>> levelOrder = new LinkedList<List<Integer>>();Queue<TreeNode> queue = new LinkedList<TreeNode>();// 根节点存入队列中  不断的遍历queue.offer(root);while(queue.size() > 0){List<Integer> level = new ArrayList<Integer>();int size = queue.size();for(int i = 0; i < size; i++){TreeNode node = queue.poll();level.add(node.val);// 这样也行TreeNode left = node.left,right = node.right;if(left != null){queue.offer(left);}if (right != null){queue.offer(right);}}levelOrder.add(0,level); // 放在头部 栈}return levelOrder;}

2.3 二叉树的锯齿形层次遍历

题目介绍:103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)
在这里插入图片描述
在这里插入图片描述
这个题也是102. 二叉树的层序遍历 - 力扣(LeetCode)的变种,只是最后输出的要求变化了,要求我们按照层数的奇偶来决定每层输出的顺序,如果当前是偶数层,从左到右输出当前层的节点值,否则,从右至左输出当前层的节点值。这里我们同样可以采用102的方法思想。

但是为了满足条件,【左右->右左】交替暑促的锯齿形,可以利用【双端队列】的数据机构来维护当前节点值的输出顺序。双端队列是一个可以在队列任意一端插入元素的队列。在广度优先遍历搜索当前节点,扩展下一层节点的时候我们仍然可以从左往右循序扩展,但是对于当前层节点的存储我们维护一个变量isOrderLeft记录时从左到右还是从右到左:

  • 如果从左到右,我们每次将被遍历的元素插入到双端队列的末尾
  • 从右到左,我们每次将被遍历的元素插入到双端队列的头部。

代码展示😋

/***  锯齿层次遍历* @param root* @return*/public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {// 校验参数if (root == null){return new ArrayList<List<Integer>>();}// 创建空间List<List<Integer>> ans = new LinkedList<List<Integer>>();Queue<TreeNode> queue = new LinkedList<TreeNode>();// 将根节点放入队列  不断循环遍历queue.offer(root);// 判断奇偶变量boolean isOrderLeft = true;while(queue.size() >0){// 这里要使用双端队列Deque<Integer> temp = new LinkedList<Integer>();int size = queue.size();for(int i = 0; i < size; i++){TreeNode t = queue.poll();if (isOrderLeft){temp.offerLast(t.val);}else{temp.offerFirst(t.val);}if (t.left != null){queue.offer(t.left);}if (t.right != null){queue.offer(t.right);}}ans.add(new LinkedList<Integer>(temp));isOrderLeft = !isOrderLeft;}return ans;}

2.4 N叉树的层次遍历

题目介绍:429. N 叉树的层序遍历 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述
首先看下N叉树的结构,就是一个值的不同,变成了以一个列表,其类型仍然时Node:

class TreeNode {public int val;public List<TreeNode> children;}

也就是说我们可以说,这个也是102. 二叉树的层序遍历 - 力扣(LeetCode)的变种,我们就用简单的广度优先,借助队列即可实现。

	/*** N 叉树的遍历* @param root* @return*/public static List<List<Integer>> nLevelOrder(NTreeNode root) {// 校验参数if (root == null){return new ArrayList<List<Integer>>();}// 创建空间List<List<Integer>> res = new ArrayList<List<Integer>>();Deque<NTreeNode> queue = new ArrayDeque<NTreeNode>();// 根节点放入队列 不断遍历queue.offer(root);while(!queue.isEmpty()){Deque<NTreeNode> next = new ArrayDeque<>();List<Integer> level = new ArrayList<>();while(!queue.isEmpty()){NTreeNode current = queue.pollFirst();level.add(current.val);// 注意这里链表遍历for (NTreeNode child : current.children){if (child != null){next.add(child);}}}// 重新定义queuequeue = next;res.add(level);}return res;}

3. 几个处理每层元素的题目

如果我们拿到每一层的元素,那么是不是可以利用一下就可以造几个题目出来呢?例如每层找最大的值,平均值,最右侧的值?当然可以。这也是力扣的上面比较经典的题目了:

题目推荐⭐⭐⭐⭐:

515. 在每个树行中找最大值 - 力扣(LeetCode)

637. 二叉树的层平均值 - 力扣(LeetCode)

199. 二叉树的右视图 - 力扣(LeetCode)

当然我们自己也可以造题目,比如说层次取最小值可以吗?每层的最左侧值可以不?是不是现在发现算法其实很好玩的🥰

3.1 在每棵树行中找出最大值

题目介绍:515. 在每个树行中找最大值 - 力扣(LeetCode)

在这里插入图片描述
这里其实就是得到一层之后使用一个变量来记录当前的最大值:

代码也很简单:

	/*** 层序遍历找到每层最大值* @param root* @return*/public static List<Integer> largestValues(TreeNode root) {// 校验参数if(root == null){return new ArrayList<Integer>();}// 创建空间List<Integer> res = new ArrayList<Integer>();Deque<TreeNode> queue = new ArrayDeque<TreeNode>();// 根节点入队,不断循环遍历queue.offer(root);while(queue.size() > 0){int size = queue.size();int maxLevel = Integer.MIN_VALUE;for(int i = 0; i < size; i++){TreeNode t = queue.poll();maxLevel = Math.max(maxLevel, t.val);if (t.left != null){queue.offer(t.left);}if (t.right != null){queue.offer(t.right);}}res.add(maxLevel);}return res;}

3.2 在每棵树行中找出平均值

题目介绍:637. 二叉树的层平均值 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述
这个题目和前面的一样,之不多每层都先将元素保存下来,最后求一个平均值就可以了,是不是是很简单;

	/*** 层序遍历,求出每层平均值* @param root* @return*/public static List<Double> averageOfLevels(TreeNode root) {// 检验参数if(root == null){return new ArrayList<Double>();}// 创建空间List<Double> res = new ArrayList<Double>();Queue<TreeNode> queue = new LinkedList<TreeNode>();// 根节点入队,不断循环queue.offer(root);while(queue.size() > 0){int size = queue.size();double sum = 0;for(int i = 0; i < size; i++ ){TreeNode t = queue.poll();sum += t.val;if (t.left != null){queue.offer(t.left);}if (t.right != null){queue.offer(t.right);}}res.add(sum/size);}return res;}

3.3 二叉树的右视图

题目介绍:199. 二叉树的右视图 - 力扣(LeetCode)
在这里插入图片描述
在这里插入图片描述
这个题目说实话出频率还挺高的,如果没有提前思考过,很难想到答案。其实也简单,在BFS进行层次遍历的时候,记录下每层的最后一个元素就可以了。

   /*** 层序遍历,输出右视图* @param root* @return*/public static List<Integer> rightSideView(TreeNode root) {// 校验参数if(root == null){return new ArrayList<Integer>();}// 创建空间List<Integer> res = new ArrayList<Integer>();Queue<TreeNode> queue = new LinkedList<TreeNode>();// 根节点入队,不断循环遍历queue.offer(root);while(!queue.isEmpty()){int size = queue.size();for(int i = 0; i < size; i++){TreeNode t = queue.poll();if (t.left != null){queue.offer(t.left);}if (t.right != null){queue.offer(t.right);}// 这里将最后一个节点放入结果集中if (i == size - 1){res.add(t.val);}}}return res;}

是不是有点成就感了,感觉算法是有套路的,并不是四刷题目。这三道题基本上都是层序遍历的变种。

那我我们也可以尝试着造出题目来:

有右视图,那么左视图行不行?俯视图行不行?想一下💡

嘿嘿😁,我这里告诉你吧,俯视图不行,但是左视图可以,想下为什么?🤔

3.4 最底层最左边

题目介绍:513. 找树左下角的值 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述
在第二部分,我们写了很多层次遍历的变种形式,这里有两个问题:

  1. 该怎么知道什么时候到最底层了?
  2. 加入最底层有两个,该怎么知道那个时最左的呢?

带着这两个问题,我们再看下层序遍历的执行过程:
在这里插入图片描述
我们可以发现,正常执行层次遍历的,不管最底层有几个元素,最后输出的一定是底层最右的元素7,这里我们就想象一下,可不可以和上面题目一样结合反转操作实现呢,每一层先反转再存入队列,到最后是不是输出的为最左节点值呢?是的,知道了这个解题关键点,我想答案你已经会写了🥰。

	public int findBottomLeftValue(TreeNode root) {// 校验参数if(root.left == null && root.right == null){return root.val;}// 创建空间Queue<TreeNode> queue = new LinkedList<TreeNode>();// 根节点入队,不断循环遍历queue.offer(root);TreeNode temp = new TreeNode();while(!queue.isEmpty()){temp = queue.poll();// 先右后左	if(temp.right != null){queue.offer(temp.right);}if(temp.left != null){queue.offer(temp.left);}}return temp.val;}

总结

提示:二叉树的层序遍历,各种变种问题,熟练掌握模板题,总结套路,是不是感觉算法也是有迹可循的😎

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【已解决】uniapp使用vant-ui中的tab标签页的时候,发现底下红色的切换线不见了

问题截图 解决办法 按F12查看vant-ui源码你会发现他的Tab标签页里面有个width&#xff0c;但是我们引入到uniapp之后发现width没有了&#xff08;不知道什么情况&#xff0c;可能是兼容问题吧&#xff09; 所以我们解决的办法&#xff0c;只需要在App.vue中给全局.van-tabs__l…

人体呼吸存在传感器成品,毫米波雷达探测感知技术,引领智能家居新潮流

随着科技的不断进步和人们生活质量的提高&#xff0c;智能化家居逐渐成为一种时尚和生活方式。 人体存在传感器作为智能家居中的重要组成部分&#xff0c;能够实时监测环境中人体是否存在&#xff0c;为智能家居系统提供更加精准的控制和联动。 在这个充满创新的时代&#xf…

华为云云耀云服务器L实例评测|在 Centos Docker 中使用Nginx部署Vue项目

目录 前言 项目构建 使用CentOS部署 安装Nginx 配置Nginx 项目启动 访问重定向 使用Docker部署 编写docker文件 dockerfile nginx dockercompose 项目启动 前言 本期我们测试在云耀云服务器L实例中分别演示如何在 系统镜像Centos 与 应用镜像 Docker 中使用Nginx…

机器学习——自然语言处理(NLP)一

机器学习——自然语言处理&#xff08;NLP&#xff09;一 文章目录 前言一、TF-IDF算法1.1. 原理1.2. 算法步骤&#xff1a;1.2.1. 文本预处理1.2.2. 构建词袋模型1.2.3. 计算TF-IDF值1.2.4. 特征选择 1.3. 代码实现1.3.1. TF-IDF1.3.2 计数器向量化文本1.3.3. 两者的区别1.3.4…

630. 课程表 III

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;贪心优先队列 写在最后 Tag 【贪心】【优先队列】【数组】 题目来源 630. 课程表 III 题目解读 有 n 门编号从 1 到 n 的课程&#xff0c;有一个数组 courses&#xff0c;其中 courses[i] [duration, lastDay] 表示…

idea报错“Static methods in interface require -target:jvm-1.8”

如题&#xff0c;在 idea 中跑 java 、scala 混编代码时&#xff0c;出现上面的错误。 问题的原因很明显是 idea 中的 jdk 版本设置有问题&#xff0c;针对性作如下排查&#xff1a; 检查项目的 java 版本 在File-> Project Settings中&#xff0c;检查检查idea的 java 版本…

【数据结构】树和二叉树概念

1.树概念及结构 树概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;…

EditPlus 配置python 及Anaconda中的python

若不是pycharm vscode 太大&#xff0c;太占内存&#xff0c;谁会想到用Notepad&#xff0c;EdirPlus 配置python呢&#xff01;&#xff01;&#xff01; 话不多说&#xff0c;首先你自己安装好EditPlus。开始 菜单栏 选择 工具 -> 配置自定义工具 组名:python 命令:d:\*…

组件间方法传递和响应(重要)

1、子组件通知父组件某时执行父组件的函数 父组件 当子组件emit时&#xff0c;父组件clickEven函数就执行了 子组件 ——————————————————————————————————————————— 2、父组件通知子组件某时执行自己的一个函数 父组件 一定要有…

Java 多线程系列Ⅶ(线程安全集合类)

线程安全集合类 前言一、多线程使用线性表二、多线程使用栈和队列三、多线程下使用哈希表 前言 在数据结构中&#xff0c;我们学习过 Java 的内置集合&#xff0c;但是我们知道&#xff0c;我们学过的大多数集合类都是线程不安全的&#xff0c;少数如 Vector&#xff0c;Stack…

【基础计算机网络1】认识计算机网络体系结构,了解计算机网络的大致模型(下)

前言 在上一篇我们主要介绍了有关计算机网络概述的内容&#xff0c;下面这一篇我们将来介绍有关计算机网络体系结构与参考模型的内容。这一篇博客紧紧联系上一篇博客。 这一篇博客主要内容是&#xff1a;计算机网络体系结构与参考模型&#xff0c;主要是计算机网络分层结构、协…

easypoi和poi版本兼容问题记录

最近在开发导出word的功能&#xff0c;遇到下面的问题 提示xml报错的问题&#xff0c;我一度以为是项目换了java11造成的。经过询问朋友&#xff0c;得知有可能是版本冲突造成的&#xff0c;就猛然想起来&#xff0c;我的项目里面还引入了poi这个包。 于是我吧poi的版本降低到了…

从零开发一款ChatGPT VSCode插件

‍本文作者是360奇舞团开发工程师 引言 OpenAI发布了ChatGPT&#xff0c;就像是给平静许久的互联网湖面上扔了一颗重磅炸弹&#xff0c;刹那间所有人都在追捧学习它。究其原因&#xff0c;它其实是一款真正意义上的人工智能对话机器人。它使用了深度学习技术&#xff0c;通过大…

【源码】JavaWeb+Mysql招聘管理系统 课设

简介 用idea和eclipse都可以&#xff0c;数据库是mysql&#xff0c;这是一个Java和mysql做的web系统&#xff0c;用于期末课设作业 cout<<"如果需要的小伙伴可以http://www.codeying.top";可定做课设 线上招聘平台整合了各种就业指导资源&#xff0c;通过了…

PCL入门(一):ubuntu20使用apt安装pcl

目录 0. 背景1. apt安装的版本2. 更新apt源3. apt安装命令4. 测试 0. 背景 使用源码安装pcl较为麻烦&#xff0c;因为存在依赖库vtk&#xff0c;flann&#xff0c;boost&#xff0c;eigen等&#xff0c;都不太好安装&#xff0c;因此采用apt方式安装。 下面内容主要参考博客《…

Redis之string类型的三大编码解读

目录 string类型的三大编码 int 编码 embstr 编码 raw 编码 明明没有超过阈值,为什么变成raw&#xff1f; 查看数据类型相关命令 redis看看类型:type key 看看编码:object encoding debug结构:debug object person 在 Redis 中&#xff0c;String 类型的数据结构并…

【linux基础(五)】Linux中的开发工具(上)---yum和vim

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到开通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux中的开发工具 1. 前言2.…

让照片动起来的软件,轻松制作照片动效

随着社交媒体的日益普及&#xff0c;我们对于照片的要求也越来越高。普通的照片已经不能满足我们的需求&#xff0c;我们希望照片更加生动有趣。照片动效便应运而生&#xff0c;它可以让照片动起来&#xff0c;吸引更多的注意力&#xff0c;让照片更加生动有趣。 照片动效制作起…

C盘清理教程

C盘清理教程 首先使用space Sniffer 扫一下c盘&#xff0c;然后看一下到底是哪个文件这么大 第二步&#xff0c;创建软链接。 首先将我们需要移动的文件的当前路径拷贝下来&#xff1a;C:\Users\Tom\Desktop\test-link\abc\ghi.txt 然后假设剪切到D盘下&#xff1a;D:\ghi.…

颜色代码对照表

颜色代码对照表 各颜色代码: 1 白色 #FFFFFF 2 红色 #FF0000 3 绿色 #00FF00 4 蓝色 #0000FF 5 牡丹红 #FF00FF 6 青色 #00FFFF 7 黄色 #FFFF00 8 黑色 #000000 9 海蓝 #70DB93 …