LCR 144. 翻转二叉树
给定一棵二叉树的根节点 root,请左右翻转这棵二叉树,并返回其根节点。
示例 1:
**输入:**root = [5,7,9,8,3,2,4]
输出:[5,9,7,4,2,3,8]
提示:
树中节点数目范围在 [0, 100] 内
-100 <= Node.val <= 100
针对子树,根节点的左指针指向翻转后的右子树,右指针指向翻转后的左子树
1234567891011class Solution {public: TreeNode *flipTree(TreeNode *root) { if (root == nullptr) return nullptr; TreeNode *mid = root->left; root->left = flipTree(root->right); root->right = flipTree(mid); return root; }};
另一种方法针对结点,根节 ...
LCR 143. 子结构判断
给定两棵二叉树 tree1 和 tree2,判断 tree2 是否以 tree1 的某个节点为根的子树具有 相同的结构和节点值 。
注意,空树 不会是以 tree1 的某个节点为根的子树具有 相同的结构和节点值 。
示例 1:
**输入:**tree1 = [1,7,5], tree2 = [6,1]
**输出:**false
**解释:**tree2 与 tree1 的一个子树没有相同的结构和节点值。
示例 2:
**输入:**tree1 = [3,6,7,1,8], tree2 = [6,1]
**输出:**true
**解释:**tree2 与 tree1 的一个子树拥有相同的结构和节点值。即 6 - > 1。
提示:
0 <= 节点个数 <= 10000
判断一个树是不是另一个树的子结构,假设是的,且根节点为A和B
则可以通过递归check判断
A->val==B->val&&check(A->left, B->left) && check(A->right, B->right);为tru ...
二 进程与线程
2.1 进程与线程
2.1.1 进程的概念和特征
1 进程的概念
为使参与并发执行的每个程序都能独立运行,必须为之配置一个专门的数据结构,称为进程控制块PCB
系统利用PCB描述进程的基本情况和运行状态,进而控制和管理进程。
程序段、相关数据段、PCB构成了进程实体
创建进程就是创建进程的PCB,撤销就是撤销进程的PCB
进程是进程实体的运行过程,是系统进行资源分配的独立单位(资源指时间片,决定了进程是一个动态的过程性的概念)
2 进程的特征
动态性;进程是程序的一次执行,有生命周期,动态地产生、变化、消亡。动态性是进程最基本的特征。
并发性;多个进程同存于内存中。引入进程的目的就是使进程能和其他进程并发执行。并发性是进程的重要特征,也是操作系统的重要特征。
独立性;指进程是一个能独立运行、独立获得资源的基本单位。
异步性;进程相互制约,各进程按独立的不可预知的速度向前推进,需要在操作系统中配置相应的进程同步机制。
2.1.2 进程的组成
1 PCB
进程创建的主要工作:
1. 申请空白的 PCB (进程控制块)
PCB是操作系统管理进程的核心数据结构,也是进程存在的唯一标志。操作系 ...
LCR 142. 训练计划 IV
给定两个以 有序链表 形式记录的训练计划 l1、l2,分别记录了两套核心肌群训练项目编号,请合并这两个训练计划,按训练项目编号 升序 记录于链表并返回。
注意:新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
**输入:**l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
**输入:**l1 = [], l2 = []
输出:[]
示例 3:
**输入:**l1 = [], l2 = [0]
输出:[0]
提示:
0 <= 链表长度 <= 1000
合并操作,我们需要一个指针来记录上一个插入到正确位置的元素是哪个,一个指针用来遍历
主要是头指针情况,此时上一个元素为空,无法直接操作。
我们可以考虑构造一个虚拟的公共结点作为头结点的前一个元素,这样可以在循环开始就使用pre了
记得最后返回公共结点的next
1234567891011121314151617181920212223class Solution {public: ListNode *trainningPlan(ListNode *l1 ...
LCR 141. 训练计划 III
给定一个头节点为 head 的单链表用于记录一系列核心肌群训练编号,请将该系列训练编号 倒序 记录于链表并返回。
示例 1:
**输入:**head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
**输入:**head = [1,2]
输出:[2,1]
示例 3:
**输入:**head = []
输出:[]
提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
前面使用双指针写过了,这里采用递归写法
反转链表就是先反转node1后面的链表,再反转node2与node1
也就是说 f(head)的问题可以拆成 f(node2)+node1
12345678910111213class Solution {public: ListNode *trainningPlan(ListNode *head) { return reverseList(head); } ListNode *reverseList(ListNode *cur) { i ...
LCR 140. 训练计划 II
给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号,请查找并返回倒数第 cnt 个训练项目编号。
示例 1:
**输入:**head = [2,4,7,8], cnt = 1
**输出:**8
提示:
1 <= head.length <= 100
0 <= head[i] <= 100
1 <= cnt <= head.length
双指针,一个指针比另一个慢cnt,这样快指针遍历结束时,慢指针就是结果
1234567891011121314class Solution {public: ListNode *trainingPlan(ListNode *head, int cnt) { ListNode *pre = head, *cur = head; for (pre; cur != nullptr; cur = cur->next) { if (cnt == 0) { pre = pre-> ...






