2024.06.22 刷题日记

2024-06-23 15:52
文章标签 2024.06 22 刷题 日记

本文主要是介绍2024.06.22 刷题日记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

199. 二叉树的右视图

这道题目的思路就是层次遍历,然后每次处理每一层所有的元素,如果是第一个就收集到答案中:

class Solution {
public:vector<int> rightSideView(TreeNode* root) {if (!root)return {};queue<TreeNode*> que;vector<int> ans;que.push(root);TreeNode* temp = nullptr;int s = que.size();while (!que.empty()) {s = que.size(); // 获取每层的长度for (int i = 0; i < s; i++) {temp = que.front();que.pop();if (i == 0)ans.push_back(temp->val);if (temp->right)que.push(temp->right);if (temp->left)que.push(temp->left);}}return ans;}
};

114. 二叉树展开为链表

思路是每次将找到当前节点的左子树的最右,然后当前节点的右子树挂在左子树的最右节点的右子树。接着遍历所有节点:

void flatten(TreeNode* root) {TreeNode* cur = root;while (cur) {if (cur->left) {// 最右TreeNode* rightMost = cur->left;while (rightMost->right) {rightMost = rightMost->right;}rightMost->right = cur->right;cur->right = cur->left;cur->left = nullptr;}cur = cur->right;}}

105. 从前序与中序遍历序列构造二叉树

这道题的思路是,使用递归,将先序序列的起始和结尾,以及中序序列的起始和结尾传入。接着preorder[preStart]就是 root 节点,然后在中序中查找这个结点 p(事实上,这里用 map 更快些),这个结点到中序的起始结点这一段就是 root 的左子树,另一半就是右子树,分别赋值给 root->leftroot->right

class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {return build(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);}TreeNode* build(vector<int> preorder, int preStart, int preEnd,vector<int> inorder, int inStart, int inEnd) {if (preStart > preEnd || inStart > inEnd)return nullptr;int rootVal = preorder[preStart];TreeNode* root = new TreeNode(rootVal);int rootIndex = inStart;while (rootIndex <= inEnd && inorder[rootIndex] != rootVal) {rootIndex++;}int leftSize = rootIndex - inStart;// 构建左子树root->left = build(preorder, preStart + 1, preStart + leftSize, inorder,inStart, rootIndex - 1);// 构建右子树root->right = build(preorder, preStart + leftSize + 1, preEnd, inorder,rootIndex + 1, inEnd);return root;}
};

由于没用 map,所以时间复杂度高:

在这里插入图片描述

总结

199. 二叉树的右视图

算法思路:

  • 使用层次遍历(广度优先搜索),从右向左处理每一层节点。
  • 每层处理时,收集第一个节点的值作为该层的右视图节点。

核心点:

  • 层次遍历。
  • 每层第一个节点的值。

114. 二叉树展开为链表

算法思路:

  • 遍历每个节点,将当前节点的左子树的最右节点找到,并将当前节点的右子树挂在这个最右节点的右子树上。
  • 将左子树置为右子树,左子树置为空,然后继续处理下一个节点。

核心点:

  • 找到左子树的最右节点。
  • 调整节点链接,将树展开为链表。

105. 从前序与中序遍历序列构造二叉树

算法思路:

  • 使用递归,根据前序遍历确定根节点,然后在中序遍历中找到根节点的位置,划分左右子树。
  • 递归构造左子树和右子树,分别赋值给根节点的左右子节点。

核心点:

  • 前序遍历的第一个节点是根节点。
  • 在中序遍历中找到根节点位置以划分左右子树。
  • 递归构造二叉树。

这篇关于2024.06.22 刷题日记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087602

相关文章

22.手绘Spring DI运行时序图

1.依赖注入发生的时间 当Spring loC容器完成了 Bean定义资源的定位、载入和解析注册以后,loC容器中已经管理类Bean 定义的相关数据,但是此时loC容器还没有对所管理的Bean进行依赖注入,依赖注入在以下两种情况 发生: 、用户第一次调用getBean()方法时,loC容器触发依赖注入。 、当用户在配置文件中将<bean>元素配置了 lazy-init二false属性,即让

刷题——比较版本号

比较版本号_牛客题霸_牛客网 int compare(string version1, string version2){int len1 = version1.size();int len2 = version2.size();int i=0,j=0;while(i<len1 || j <len2){long num1 =0 ;while(i <len1 && version1.charAt

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学

leetcode刷题(46)——236. 二叉树的最近公共祖先

这道题比235略难一些 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入:

leetcode刷题(45)——35. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] 示例 1: 输入: root = [

leetcode刷题(44)——242. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true 示例 2: 输入: s = “rat”, t = “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

leetcode刷题(43)——239. 滑动窗口最大值

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值------------

leetcode刷题(42)——703. 数据流中的第K大元素

设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。 示例: int k = 3;int[] arr = [4,5,8,2];KthLargest kthLar

leetcode刷题(41)——232. 用栈实现队列

使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 示例: MyQueue queue = new MyQueue();queue.push(1);queue.push(2); queue.peek(); // 返回 1queue.pop();