代码随想录算法训练营第十五天| 层序遍历 10 226.翻转二叉树 101.对称二叉树 2
1.代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。2.代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II3.代码随想录算法训练营第三天| 203.移除链表元素,707.设计链表 ,206.反转链表4.代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 142.环形链表II5.代码随想录算法训练营第六天| 哈希表理论基础 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和6.代码随想录算法训练营第七天| 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和7.代码随想录算法训练营第八天| 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字 151.翻转字符串里的单词 卡码网:55.右旋转字符串8.代码随想录算法训练营第九天| 28. 实现 strStr() 459.重复的子字符串 字符串总结 双指针回顾9.代码随想录算法训练营第十天| 堆栈理论基础 232.用栈实现队列 225. 用队列实现栈10.代码随想录算法训练营第十一天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值11.代码随想录算法训练营第十三天|239. 滑动窗口最大值 347.前 K 个高频元素 总结12.代码随想录算法训练营第十四天| 理论基础 递归遍历 迭代遍历 统一迭代
13.代码随想录算法训练营第十五天| 层序遍历 10 226.翻转二叉树 101.对称二叉树 2
14.代码随想录算法训练营第十六天| 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数15.代码随想录算法训练营第十七天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和16.代码随想录算法训练营第十八天|● 513.找树左下角的值 ● 112. 路径总和 113.路径总和ii ● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树17.代码随想录算法训练营第十九天|654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树18.代码随想录算法训练营第二十天|530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先19.代码随想录算法训练营第二十二天|235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点20.代码随想录算法训练营第二十三天|669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇21.代码随想录算法训练营第二十四天|● 理论基础 ● 77. 组合22.代码随想录算法训练营第二十五天| 216.组合总和III 17.电话号码的字母组合23.代码随想录算法训练营第二十六天| 39. 组合总和 40.组合总和II 131.分割回文串24.代码随想录算法训练营第二十七天| 93.复原IP地址 78.子集 90.子集II25.代码随想录算法训练营第二十九天| 491.递增子序列 46.全排列 47.全排列 II26.代码随想录算法训练营第三十天|回溯法总结27.代码随想录算法训练营第三十一天| 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和28.代码随想录算法训练营第三十二天| ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II29.代码随想录算法训练营第三十三天| ● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果30.代码随想录算法训练营第三十四天| ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球31.代码随想录算法训练营第三十六天| ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间32.代码随想录算法训练营第三十七天| ● 738.单调递增的数字 ● 968.监控二叉树 ● 总结33.代码随想录算法训练营第三十八天| ● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯34.代码随想录算法训练营第三十九天|● 62.不同路径 ● 63. 不同路径 II35.代码随想录算法训练营第四十天|● 343. 整数拆分 ● 96.不同的二叉搜索树36.代码随想录算法训练营第四十一天|01背包问题, 01背包问题—— 滚动数组,分割等和子集37.代码随想录算法训练营第四十三天|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零38.代码随想录算法训练营第四十四天|完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ39.代码随想录算法训练营第四十五天| ● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数40.代码随想录算法训练营第四十六天| 139.单词拆分 多重背包 背包问题总结篇!41.代码随想录算法训练营第四十七天| ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III42.代码随想录算法训练营第四十八天| ● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II43.代码随想录算法训练营第五十天| ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV44.代码随想录算法训练营第五十一天| ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 ●总结45.代码随想录算法训练营第五十二天| ● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组46.代码随想录算法训练营第五十三天| ● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划47.代码随想录算法训练营第五十四天| ● 392.判断子序列 ● 115.不同的子序列48.代码随想录算法训练营第五十五天| ● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇49.代码随想录算法训练营第五十七天| 九章 动态规划part17 ● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇50.代码随想录算法训练营第五十八天|● 739. 每日温度 ● 496.下一个更大元素 I51.代码随想录算法训练营第五十九天|● 503.下一个更大元素II ● 42. 接雨水52.代码随想录算法训练营第六十天|● 84.柱状图中最大的矩形53.每日一题: 2192. 有向无环图中一个节点的所有祖先54.每日一题:1026. 节点与其祖先之间的最大差值55.每日一题:1483. 树节点的第 K 个祖先层序遍历
思路:结合了昨天学到的标记法,每当一层遍历完,向队列中添加一个NULL标记。遍历到NULL节点表示该层遍历完了,将结果存入结果集中。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
* right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> q;
if (root == NULL)
return res;
q.push(root);
q.push(NULL);
TreeNode* t;
vector<int> tmp;
while (!q.empty()) {
if (q.front() == NULL) {
q.pop();
if (q.empty()) {
res.push_back(tmp);
break;
}
q.push(NULL);
res.push_back(tmp);
tmp.clear();
}
t = q.front();
tmp.push_back(t->val);
if (t->left)
q.push(t->left);
if (t->right)
q.push(t->right);
q.pop();
}
return res;
}
};
然而这个方法似乎并不够简洁。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector <vector <int>> ret;
if (!root) {
return ret;
}
queue <TreeNode*> q;
q.push(root);
while (!q.empty()) {
int currentLevelSize = q.size();
ret.push_back(vector <int> ());
for (int i = 1; i <= currentLevelSize; ++i) {
auto node = q.front(); q.pop();
ret.back().push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
return ret;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/solutions/241885/er-cha-shu-de-ceng-xu-bian-li-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目链接:107. 二叉树的层序遍历 II - 力扣(LeetCode)
本题要求反向输出层序遍历,代码不需要变动,别忘了vector可以颠倒。
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
auto levelOrder = vector<vector<int>>();
if (!root) {
return levelOrder;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
auto level = vector<int>();
int size = q.size();
for (int i = 0; i < size; ++i) {
auto node = q.front();
q.pop();
level.push_back(node->val);
if (node->left) {
q.push(node->left);
}
if (node->right) {
q.push(node->right);
}
}
levelOrder.push_back(level);
}
reverse(levelOrder.begin(), levelOrder.end());
return levelOrder;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/solutions/402560/er-cha-shu-de-ceng-ci-bian-li-ii-by-leetcode-solut/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目链接:199. 二叉树的右视图 - 力扣(LeetCode)
层序遍历的变体,只需要保存每一层的最后一个就行。
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector <int> ret;
if (!root) {
return ret;
}
queue <TreeNode*> q;
q.push(root);
while (!q.empty()) {
int currentLevelSize = q.size();
for (int i = 1; i <= currentLevelSize; ++i) {
auto node = q.front(); q.pop();
if(i==currentLevelSize)
ret.push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
return ret;
}
翻转二叉树
题目链接:226. 翻转二叉树 - 力扣(LeetCode)
思路:题目不难,还是层序遍历的思想,只要把每个进入队列的节点都转换一下就行了,每个节点只会入队一次,因此也只会转换一次。
class Solution {
public:
void swap(TreeNode *node){
if(node->left){
TreeNode* tmp=node->left;
node->left=node->right;
node->right=tmp;
}
else{
TreeNode* tmp=node->right;
node->right=node->left;
node->left=tmp;
}
}
TreeNode* invertTree(TreeNode* root) {
TreeNode* node;
queue<TreeNode*>q;
if(root==NULL)return root;
q.push(root);
while(!q.empty()){
node=q.front();
swap(node);
if(node->left)q.push(node->left);
if(node->right)q.push(node->right);
q.pop();
}
return root;
}
};
显然递归法更简洁,没想到竟然能递归自己。
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) {
return nullptr;
}
TreeNode* left = invertTree(root->left);
TreeNode* right = invertTree(root->right);
root->left = right;
root->right = left;
return root;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/invert-binary-tree/solutions/415160/fan-zhuan-er-cha-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
对称二叉树
思路:简单看了下讲解,自己手写出来了,虽然不是很简洁,但是逻辑清晰。
class Solution {
public:
bool compare(TreeNode* left,TreeNode*right){
if(left==NULL&&right==NULL)return true;
else if(left!=NULL&&right==NULL)return false;
else if(left==NULL&&right!=NULL)return false;
else if(left->val!=right->val)return false;
else {
return compare(left->left,right->right)&&compare(left->right,right->left);
}
}
bool isSymmetric(TreeNode* root) {
if(root==NULL)return true;
return compare(root->left,root->right);
}
};
这里留一个更简洁的写法,思路一致
class Solution {
public:
bool check(TreeNode *p, TreeNode *q) {
if (!p && !q) return true;
if (!p || !q) return false;
return p->val == q->val && check(p->left, q->right) && check(p->right, q->left);
}
bool isSymmetric(TreeNode* root) {
return check(root, root);
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/symmetric-tree/solutions/268109/dui-cheng-er-cha-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构