代码随想录算法训练营第十五天 | 层序遍历 10,226.翻转二叉树,101.对称二叉树 2
代码随想录算法训练营第十五天 | 层序遍历 10,226.翻转二叉树,101.对称二叉树 2
1.1 层序遍历 10
1.1.1 102.二叉树的层序遍历
思路:
- 通过队列实现
class Solution {public:vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*> q;vector<vector<int>> res;if(!root) return res;q.push(root);while(!q.empty()){int size = q.size();vector<int> cur;for(int i = 1; i <= size; ++i){TreeNode* node = q.front();q.pop();cur.push_back(node->val);if(node->left) q.push(node->left);if(node->right) q.push(node->right);}res.push_back(cur);}return res;}
};
1.1.2 二叉树的层次遍历 II
思路:
- 结果翻转一下
class Solution {public:vector<vector<int>> levelOrderBottom(TreeNode* root) {queue<TreeNode*> q;vector<vector<int>> res;if(!root) return res;q.push(root);while(!q.empty()){int size = q.size();vector<int> cur;for(int i = 1; i <= size; ++i){TreeNode* node = q.front();q.pop();cur.push_back(node->val);if(node->left) q.push(node->left);if(node->right) q.push(node->right);}res.push_back(cur);}reverse(res.begin(), res.end());return res;}
};
1.1.3 二叉树的右视图
思路:
- 只有是当前层的最后一个才加入
class Solution {public:vector<int> rightSideView(TreeNode* root) {queue<TreeNode*> q;vector<int> res;if(!root) return res;q.push(root);while(!q.empty()){int size = q.size();for(int i = 1; i <= size; ++i){TreeNode* node = q.front();q.pop();if(i == size) res.push_back(node->val);if(node->left) q.push(node->left);if(node->right) q.push(node->right);}}return res;}
};
1.1.4 二叉树的层平均值
思路:
- sum记录每层和即可
class Solution {public:vector<double> averageOfLevels(TreeNode* root) {queue<TreeNode*> q;vector<double> res;if(!root) return res;q.push(root);while(!q.empty()){int size = q.size();double sum = 0;for(int i = 1; i <= size; ++i){TreeNode* node = q.front();q.pop();sum += node->val;if(node->left) q.push(node->left);if(node->right) q.push(node->right);}res.push_back(sum / size);}return res;}
};
1.1.5 N叉树的层序遍历
思路:
- 添加的节点数从2个变为复数个
class Solution {public:vector<vector<int>> levelOrder(Node* root) {queue<Node*> q;vector<vector<int>> res;if(!root) return res;q.push(root);while(!q.empty()){int size = q.size();vector<int> cur;for(int i = 1; i <= size; ++i){Node* node = q.front();q.pop();cur.push_back(node->val);for(int j = 0; j < node->children.size(); ++j){if(node->children[j]) q.push(node->children[j]);} }res.push_back(cur);}return res;}
};
1.1.6 515.在每个树行中找最大值
思路:
- 每层比较即可
class Solution {public:vector<int> largestValues(TreeNode* root) {queue<TreeNode*> q;vector<int> res;if(!root) return res;q.push(root);while(!q.empty()){int size = q.size();int max = INT_MIN;for(int i = 1; i <= size; ++i){TreeNode* node = q.front();q.pop();max = max < node->val ? node->val : max;if(node->left) q.push(node->left);if(node->right) q.push(node->right);}res.push_back(max);}return res;}
};
1.1.7 116.填充每个节点的下一个右侧节点指针
思路:
- 理清关系即可
class Solution {public:Node* connect(Node* root) {queue<Node*> q;if(!root) return root;q.push(root);while(!q.empty()){int size = q.size();for(int i = 1; i <= size; ++i){Node* node = q.front();q.pop();if(i != size) node->next = q.front();else node->next = nullptr;if(node->left) q.push(node->left);if(node->right) q.push(node->right);}}return root; }
};
1.1.8 117.填充每个节点的下一个右侧节点指针II
思路:
- 同上,没有区别
class Solution {public:Node* connect(Node* root) {queue<Node*> q;if(!root) return root;q.push(root);while(!q.empty()){int size = q.size();for(int i = 1; i <= size; ++i){Node* node = q.front();q.pop();if(i != size) node->next = q.front();else node->next = nullptr;if(node->left) q.push(node->left);if(node->right) q.push(node->right);}}return root; }
};
1.1.9 104.二叉树的最大深度
思路:
- 使用迭代法的话,可以使用层序遍历的方式
class Solution {public:int maxDepth(TreeNode* root) {if (root == NULL) return 0;int depth = 0;queue<TreeNode*> que;que.push(root);while(!que.empty()) {int size = que.size();depth++; // 记录深度for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return depth;}
};
思路:
- 也可以使用递归的方式
class Solution {public:int maxDepth(TreeNode* root) {if(root == nullptr) return 0;return max(maxDepth(root->right), maxDepth(root->left)) +1;}
};
1.1.10 111.二叉树的最小深度
思路:
- 当左右孩子都为空时,就可以结束了
class Solution {public:int minDepth(TreeNode* root) {if (root == nullptr) return 0;int depth = 0;queue<TreeNode*> que;que.push(root);while(!que.empty()) {int size = que.size();depth++;for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();if (node->left) que.push(node->left);if (node->right) que.push(node->right);if (!node->left && !node->right) return depth;}}return depth;}
};
1.2 226.翻转二叉树
思路:
- 递归(前序遍历)
- 迭代-深度优先(前序遍历+栈)
- 迭代-广度优先(层序遍历+队列)
class Solution {public:TreeNode* invertTree(TreeNode* root) {if(root == nullptr) return root;swap(root->left, root->right);invertTree(root->left);invertTree(root->right);return root;}
};
class Solution {public:TreeNode* invertTree(TreeNode* root) {if (root == NULL) return root;stack<TreeNode*> st;st.push(root);while(!st.empty()) {TreeNode* node = st.top(); // 中st.pop();swap(node->left, node->right);if(node->right) st.push(node->right); // 右if(node->left) st.push(node->left); // 左}return root;}
};
class Solution {public:TreeNode* invertTree(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);while (!que.empty()) {int size = que.size();for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();swap(node->left, node->right); // 节点处理if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return root;}
};
1.3 101. 对称二叉树
思路:
- 比较的不是左右节点,而是左右子树
递归方式(1)
class Solution {public:bool compare(TreeNode* left, TreeNode* right) {// 首先排除空节点的情况if (left == NULL && right != NULL) return false;else if (left != NULL && right == NULL) return false;else if (left == NULL && right == NULL) return true;// 排除了空节点,再排除数值不相同的情况else if (left->val != right->val) return false;// 此时就是:左右节点都不为空,且数值相同的情况// 此时才做递归,做下一层的判断bool outside = compare(left->left, right->right); // 左子树:左、 右子树:右bool inside = compare(left->right, right->left); // 左子树:右、 右子树:左bool isSame = outside && inside; // 左子树:中、 右子树:中 (逻辑处理)return isSame;}bool isSymmetric(TreeNode* root) {if (root == NULL) return true;return compare(root->left, root->right);}
};
递归方式(2)
class Solution {public:bool isSymmetric(TreeNode* root) {return dfs(root, root);}
private:bool dfs(TreeNode* tree1, TreeNode* tree2){if(tree1 == nullptr && tree2 == nullptr) return true;if(tree1 == nullptr || tree2 == nullptr) return false;if(tree1->val == tree2->val){return dfs(tree1->left, tree2->right) && dfs(tree1->right, tree2->left);}else{return false;}}
};
迭代+队列(栈也可以)
class Solution {public:bool isSymmetric(TreeNode* root) {if (root == NULL) return true;queue<TreeNode*> que;que.push(root->left); // 将左子树头结点加入队列que.push(root->right); // 将右子树头结点加入队列while (!que.empty()) { // 接下来就要判断这两个树是否相互翻转TreeNode* leftNode = que.front(); que.pop();TreeNode* rightNode = que.front(); que.pop();if (!leftNode && !rightNode) { // 左节点为空、右节点为空,此时说明是对称的continue;}// 左右一个节点不为空,或者都不为空但数值不相同,返回falseif ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {return false;}que.push(leftNode->left); // 加入左节点左孩子que.push(rightNode->right); // 加入右节点右孩子que.push(leftNode->right); // 加入左节点右孩子que.push(rightNode->left); // 加入右节点左孩子}return true;}
};
代码随想录算法训练营第十五天 | 层序遍历 10,226.翻转二叉树,101.对称二叉树 2相关推荐
- 代码随想录算法训练营第十五天| 102层序遍历、226.翻转二叉树、101. 对称二叉树
层序遍历 参考文章:代码随想录 解题思路: 层序遍历一个二叉树.就是从左到右一层一层的去遍历二叉树.这种遍历的方式和我们之前讲过的都不太一样. 需要借用一个辅助数据结构即队列来实现,队列先进先出,符合 ...
- 代码随想录算法训练营三十五天|860,406,452
860. 柠檬水找零 贪心,20-10+5,10-5 class Solution { public:bool lemonadeChange(vector<int>& bills) ...
- 代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合
LeetCode 216.组合总和III 链接:216. 组合总和 III 思路: 这道题目与77. 组合仅有一点不同,就是这道题目找到的组合的总和需要满足额外的条件.所以在递归终止条件里增加了一个条 ...
- 代码随想录算法训练营第十五天 | 102. 二叉树的层序遍历 | 226.翻转二叉树 | 101. 对称二叉树
递归三部曲 确定递归函数的参数和返回值 确定终止条件 确定单层递归的逻辑 102. 二叉树的层序遍历 题解及想法 解法一 :递归法 class Solution {public List<Lis ...
- 代码随想录算法训练营第二十五天|216.组合总和III 17.电话号码的字母组合
目录 LeeCode 216.组合总和III LeeCode 17.电话号码的字母组合 LeeCode 216.组合总和III 216. 组合总和 III - 力扣(LeetCode) 思路:本题和 ...
- 代码随想录算法训练营第十六天[二刷] | 找寻二叉的深度
104.二叉树的最大深度 递归 首先知道 题目问的整个树的最大的深度 = root 的高度 这样用post-order 写起来会很方便 为什么Post - order? 处理完子树之后,再 把数值(本 ...
- 代码随想录算法训练营第二十四天 | 理论基础、77. 组合
学习目标 学习回溯算法理论基础, 并进行练习 学习内容 回溯算法理论基础 文章链接:回溯算法理论基础 小结:回溯算法模板: void backtracking(参数) {if (终止条件) {存放结果 ...
- 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和
代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...
- 代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球
代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球 860.柠檬水找零 406. 根据身高重建队列 452. 用最少数量的箭引爆气球 860. ...
最新文章
- 领域模型中分散的事务如何集中统一处理(C#解决方案)
- ubuntu上使用cron执行定时任务计划
- Ciruy英雄谭 Chapter 2 Web浏览器如何将数据委托出去(一)
- Python自动化测试 (九)urllib2 发送HTTP Request
- ECOMP已经开源成功,这次ATT准备推动白盒路由操作系统DNOS
- ITFriend创业败局(四):菜鸟CEO的自我修养
- 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集...
- Android之jni编译出现error: jump to label ‘XXXX’ [-fpermissive]解决办法
- 动态改变eachers图表高_让你的Excel图表动起来
- java使用poi读取存储excel表格,包括xls和xlsx格式
- 海康摄像机取流RTSP地址规则说明
- 全志r16android sdk,全志 Allwinner R16 SoC 全套设计资料分享 原理图 PCB 数据手册 SDK...
- FPGA实现全流水arccos,arcsin,任意次开放操作
- visio画两条直线交叉但不弯曲不跨线
- 2021年茶艺师(初级)考试内容及茶艺师(初级)模拟考试
- Word一部分内容分为两栏或多栏的方法
- 走访名校名企,助力生涯规划
- 正式加入阿里巴巴!跟Android初学者分享几点经验,附超全教程文档
- 关于iperf工具的了解
- 总结一些实习的心得和技巧
热门文章
- python正则表达式验证
- c#语言float转换int,c#中怎么把int向float型转换?
- PLSQL怎样导出oracle表结构和数据
- Unity编辑器扩展 自定义脚本属性面板--基础篇
- java 字节流和字符流
- 《Photoshop修色圣典——PPW专业照片修正流程与技巧》—第1章颜色、对比、颜色...
- HTML多媒体(插件/音频/视频/YouTube):一篇就够用
- 新手做shopee虾皮为什么一直不开单?知虾数据分享开店几个技巧
- 知识工场 | 让机器认知中文实体 —复旦大学知识工场发布中文实体识别与链接服务
- vue项目目录及其作用