代码随想录算法训练营第十五天 | 层序遍历 10,226.翻转二叉树,101.对称二叉树 2

1.1 层序遍历 10

1.1.1 102.二叉树的层序遍历

思路:

  1. 通过队列实现
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

思路:

  1. 结果翻转一下
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 二叉树的右视图

思路:

  1. 只有是当前层的最后一个才加入
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 二叉树的层平均值

思路:

  1. 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叉树的层序遍历

思路:

  1. 添加的节点数从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.在每个树行中找最大值

思路:

  1. 每层比较即可
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.填充每个节点的下一个右侧节点指针

思路:

  1. 理清关系即可
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

思路:

  1. 同上,没有区别
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.二叉树的最大深度

思路:

  1. 使用迭代法的话,可以使用层序遍历的方式
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;}
};

思路:

  1. 也可以使用递归的方式
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.二叉树的最小深度

思路:

  1. 当左右孩子都为空时,就可以结束了
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.翻转二叉树

思路:

  1. 递归(前序遍历)
  2. 迭代-深度优先(前序遍历+栈)
  3. 迭代-广度优先(层序遍历+队列)
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. 比较的不是左右节点,而是左右子树

递归方式(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相关推荐

  1. 代码随想录算法训练营第十五天| 102层序遍历、226.翻转二叉树、101. 对称二叉树

    层序遍历 参考文章:代码随想录 解题思路: 层序遍历一个二叉树.就是从左到右一层一层的去遍历二叉树.这种遍历的方式和我们之前讲过的都不太一样. 需要借用一个辅助数据结构即队列来实现,队列先进先出,符合 ...

  2. 代码随想录算法训练营三十五天|860,406,452

    860. 柠檬水找零 贪心,20-10+5,10-5 class Solution { public:bool lemonadeChange(vector<int>& bills) ...

  3. 代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合

    LeetCode 216.组合总和III 链接:216. 组合总和 III 思路: 这道题目与77. 组合仅有一点不同,就是这道题目找到的组合的总和需要满足额外的条件.所以在递归终止条件里增加了一个条 ...

  4. 代码随想录算法训练营第十五天 | 102. 二叉树的层序遍历 | 226.翻转二叉树 | 101. 对称二叉树

    递归三部曲 确定递归函数的参数和返回值 确定终止条件 确定单层递归的逻辑 102. 二叉树的层序遍历 题解及想法 解法一 :递归法 class Solution {public List<Lis ...

  5. 代码随想录算法训练营第二十五天|216.组合总和III 17.电话号码的字母组合

    目录 LeeCode 216.组合总和III LeeCode 17.电话号码的字母组合 LeeCode 216.组合总和III 216. 组合总和 III - 力扣(LeetCode) 思路:本题和 ...

  6. 代码随想录算法训练营第十六天[二刷] | 找寻二叉的深度

    104.二叉树的最大深度 递归 首先知道 题目问的整个树的最大的深度 = root 的高度 这样用post-order 写起来会很方便 为什么Post - order? 处理完子树之后,再 把数值(本 ...

  7. 代码随想录算法训练营第二十四天 | 理论基础、77. 组合

    学习目标 学习回溯算法理论基础, 并进行练习 学习内容 回溯算法理论基础 文章链接:回溯算法理论基础 小结:回溯算法模板: void backtracking(参数) {if (终止条件) {存放结果 ...

  8. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

  9. 代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球

    代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球 860.柠檬水找零 406. 根据身高重建队列 452. 用最少数量的箭引爆气球 860. ...

最新文章

  1. 领域模型中分散的事务如何集中统一处理(C#解决方案)
  2. ubuntu上使用cron执行定时任务计划
  3. Ciruy英雄谭 Chapter 2 Web浏览器如何将数据委托出去(一)
  4. Python自动化测试 (九)urllib2 发送HTTP Request
  5. ECOMP已经开源成功,这次ATT准备推动白盒路由操作系统DNOS
  6. ITFriend创业败局(四):菜鸟CEO的自我修养
  7. 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集...
  8. Android之jni编译出现error: jump to label ‘XXXX’ [-fpermissive]解决办法
  9. 动态改变eachers图表高_让你的Excel图表动起来
  10. java使用poi读取存储excel表格,包括xls和xlsx格式
  11. 海康摄像机取流RTSP地址规则说明
  12. 全志r16android sdk,全志 Allwinner R16 SoC 全套设计资料分享 原理图 PCB 数据手册 SDK...
  13. FPGA实现全流水arccos,arcsin,任意次开放操作
  14. visio画两条直线交叉但不弯曲不跨线
  15. 2021年茶艺师(初级)考试内容及茶艺师(初级)模拟考试
  16. Word一部分内容分为两栏或多栏的方法
  17. 走访名校名企,助力生涯规划
  18. 正式加入阿里巴巴!跟Android初学者分享几点经验,附超全教程文档
  19. 关于iperf工具的了解
  20. 总结一些实习的心得和技巧

热门文章

  1. python正则表达式验证
  2. c#语言float转换int,c#中怎么把int向float型转换?
  3. PLSQL怎样导出oracle表结构和数据
  4. Unity编辑器扩展 自定义脚本属性面板--基础篇
  5. java 字节流和字符流
  6. 《Photoshop修色圣典——PPW专业照片修正流程与技巧》—第1章颜色、对比、颜色...
  7. HTML多媒体(插件/音频/视频/YouTube):一篇就够用
  8. 新手做shopee虾皮为什么一直不开单?知虾数据分享开店几个技巧
  9. 知识工场 | 让机器认知中文实体 —复旦大学知识工场发布中文实体识别与链接服务
  10. vue项目目录及其作用