算法训练营第十八天 | LeetCode 102 二叉树的层序遍历、LeetCode 226 翻转二叉树、LeetCode 101 对称二叉树

ops/2024/12/22 9:08:24/

LeetCode 102 二叉树的层序遍历

这题用的队列和指针遍历法。难点在于记录每层末尾位置,这就要用到两个指针,一个end指针记录末尾节点,一个endchild跟着遍历该层内子节点位置,记录下一层末尾节点位置,方便在该层节点遍历结束后将其值赋给end指针进行下一层遍历。

代码如下:

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;if (!root) return res;queue<TreeNode*> myque;myque.push(root);TreeNode* end = root;TreeNode* endchild = root;while (!myque.empty()) {vector<int> level;TreeNode* cur = myque.front();while (cur != end) {level.push_back(cur->val);if (cur->left) {myque.push(cur->left);endchild = cur->left;}if (cur->right) {myque.push(cur->right);endchild = cur->right;}myque.pop();cur = myque.front();}level.push_back(cur->val);res.push_back(level);if (cur->left) {myque.push(cur->left);endchild = cur->left;}if (cur->right) {myque.push(cur->right);endchild = cur->right;}end = endchild;myque.pop();}return res;}
};

但是中午发现我好像忘了队列自带的size函数了。修改后如下:

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;if (!root) return res;queue<TreeNode*> myque;myque.push(root);while (!myque.empty()) {vector<int> level;int num = myque.size();while (num--) {TreeNode* cur = myque.front();level.push_back(cur->val);if (cur->left) {myque.push(cur->left);}if (cur->right) {myque.push(cur->right);}myque.pop();}res.push_back(level);}return res;}
};

这样就可以直接用队列长度区分不同层了。

LeetCode 226 翻转二叉树

测试用例很简单,直接交换左右节点指针即可。采用递归法。

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if (!root) return root;TreeNode* tmp = root->right;root->right = root->left;root->left = tmp;invertTree(root->left);invertTree(root->right);return root;}
};

采用层序遍历法:

class Solution {
public:void myswap(TreeNode*& root) {if (!root) return;TreeNode* tmp = root->right;root->right = root->left;root->left = tmp;}TreeNode* invertTree(TreeNode* root) {if (!root) return root;queue<TreeNode*> myque;myque.push(root);while (!myque.empty()) {int num = myque.size();while (num--) {TreeNode* cur = myque.front();myswap(cur);if (cur->left) myque.push(cur->left);if (cur->right) myque.push(cur->right);myque.pop();}}return root;}
};

前序遍历,注意要用一个指针保存root指针原始位置

class Solution {
public:void myswap(TreeNode*& root) {if (!root) return;TreeNode* tmp = root->right;root->right = root->left;root->left = tmp;}TreeNode* invertTree(TreeNode* root) {if (!root) return root;stack<TreeNode*> mysta;TreeNode* store = root;while (root || !mysta.empty()) {while (root) {myswap(root);mysta.push(root);root = root->left;}root = mysta.top();root = root->right;mysta.pop();}root = store;return root;}
};

中序遍历会遇到一些麻烦的问题,因为遍历完子节点,到根节点,要是交换了根节点,那么右节点就会变子节点了。今天打卡没有要求,暂时就实现到这里,我们看下一题。

LeetCode 101 对称二叉树

递归法:

左右子节点交换判断,其实很简单

class Solution {
public:bool check(TreeNode* p, TreeNode* q) {if (!p && !q) return true;if (!p && q) return false;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);}
};

迭代法:

用一个队列将根节点入队列两次,之后每次取出两个节点比较,需要再往下判断的话,将两个节点左右节点相反顺序放入继续比较。

class Solution {
public:bool isSymmetric(TreeNode* root) {queue<TreeNode*> myque;if (!root) return true;myque.push(root);myque.push(root);while (!myque.empty()) {TreeNode* p = myque.front();myque.pop();TreeNode* q = myque.front();myque.pop();if (!p && !q) continue;if (!p && q) return false;if (p && !q) return false;if (p->val != q->val) return false;myque.push(p->left);myque.push(q->right);myque.push(p->right);myque.push(q->left);}return true;}
};

需要注意的是!p和!q的时候是进入下一重循环而不是直接return true


http://www.ppmy.cn/ops/31617.html

相关文章

242 基于matlab的3D路径规划

基于matlab的3D路径规划&#xff0c;蚁群算法&#xff08;ACO&#xff09;和天牛须&#xff08;BAS&#xff09;以及两种结合的三种优化方式&#xff0c;对3D路径规划的最短路径进行寻优。程序已调通&#xff0c;可直接运行。 242 3D路径规划 蚁群算法和天牛须 - 小红书 (xiaoh…

4. 迭代查询与递归查询

实际上&#xff0c;DNS解析是一个包含迭代查询和递归查询的过程。 递归查询指的是查询请求发出后&#xff0c;域名服务器代为向下一级域名服务器发出请求&#xff0c;最后向用户返回查询的最终结果。使用递归 查询&#xff0c;用户只需要发出一次查询请求。迭代查询指的是查询…

springboot整合mybatis配置多数据源(mysql/oracle)

目录 前言导入依赖坐标创建mysql/oracle数据源配置类MySQLDataSourceConfigOracleDataSourceConfig application.yml配置文件配置mysql/oracle数据源编写Mapper接口编写Book实体类编写测试类 前言 springboot整合mybatis配置多数据源&#xff0c;可以都是mysql数据源&#xff…

leetcode刷题(3): 动态规划

文章目录 42. 接雨水解题思路c 实现 64. 最小路径和解题思路c 实现 62 不同路径解题思路c 实现 42. 接雨水 题目&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例: 解题思路 使用动态…

VitePress 构建的博客如何部署到 Netlify 平台?

VitePress 构建的博客如何部署到 Netlify 平台&#xff1f; 前言 之前写了篇文章【使用 Vitepress 构建博客并部署到 github 平台】&#xff0c;有个老哥说 github page 访问太慢了&#xff0c;希望放到 Netlify 平台上面。 咱也没部署过&#xff0c;就试了一下&#xff0c;发…

面试经典150题——判断子序列

面试经典150题 day26 题目来源我的题解方法一 双指针方法二 动态规划 题目来源 力扣每日一题&#xff1b;题序&#xff1a;392 我的题解 方法一 双指针 分别使用一个指针控制两个字符串的遍历&#xff0c;当两个指针的位置的字符相同时&#xff0c;同时移动两个指针&#xf…

vue的action与mutation 的区别

在 Vue.js 的状态管理库 Vuex 中&#xff0c;mutations 和 actions 都是用于更改状态的方法&#xff0c;但它们之间存在一些重要的区别。下面我将通过举例来说明这些区别&#xff1a; 1. 基本定义 mutations&#xff1a;用于直接修改状态&#xff08;state&#xff09;。它们是…

JavaScript 简单类型与复杂类型

一、简单类型与复杂类型 简单类型又叫做基本数据类型或者值类型&#xff0c;复杂类型又叫做引用类型 值类型&#xff1a;简单数据类型&#xff0c;在存储时变量中存储的是值本身&#xff0c;因此叫做值类型 string number boolean undefined null 返回的是空的对象 ob…