第六章 二叉树 part02
今日内容:
● 层序遍历 10
● 226.翻转二叉树
● 101.对称二叉树 2
看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大家可以很快刷了十道题。
题目链接/文章讲解/视频讲解:代码随想录
102.二叉树的层序遍历
【链接】(文章,视频,题目)
【第一想法与实现(困难)】
【看后想法】
-
迭代方法可以理解
-
递归方法想不到
【实现困难】
【自写代码】
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
// 二叉树层序遍历,迭代方法
std::vector<std::vector<int>> res;
std::queue<TreeNode*> que;
if (root) {
que.push(root);
}
while (!que.empty()) {
int size = que.size(); // 本层的已有size
std::vector<int> vec;
for (int i = 0; i < size; ++i) {
TreeNode* node = que.front();
que.pop();
// 处理
vec.emplace_back(node->val);
// 访问
if (node->left) {
que.push(node->left);
}
if (node->right) {
que.push(node->right);
}
}
res.emplace_back(std::move(vec));
}
return res;
}
};
【收获与时长】1小时
199.二叉树的右视图
【链接】(文章,视频,题目)
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
【第一想法与实现(困难)】
-
想直接在队列中只存每层最右边的结点,发现有可能从左边延伸出来
-
暴力,层序遍历的vector of vector,每层再取最右边获得vector
【看后想法】
-
由于不知道一层的最右边结点从哪里长出来,所以队列还是要存储一层的所有结点(循环之外)
-
但是处理的过程可以优化,只把最右边的存起来
【实现困难】
【自写代码】
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> res;
std::queue<TreeNode*> que;
if (root) {
que.push(root);
}
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; ++i) {
TreeNode* node = que.front();
que.pop();
// 处理
if (i == size - 1) {
res.emplace_back(node->val);
}
// 访问
if (node->left) {
que.push(node->left);
}
if (node->right) {
que.push(node->right);
}
}
}
return res;
}
};
【收获与时长】
226.翻转二叉树 (优先掌握递归)
【链接】(文章,视频,题目)
这道题目 一些做过的同学 理解的也不够深入,建议大家先看我的视频讲解,无论做过没做过,都会有很大收获。
题目链接/文章讲解/视频讲解:代码随想录
【第一想法与实现(困难)】
交换左右孩子(如果都有)
【看后想法】
- 多种不同的解法,我一开始只想到层序遍历,实际上前序后序都可以做,并且递归方法代码比较简单
【实现困难】
【自写代码】
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
// 前序遍历,递归方法
// 三要素,参数返回值,利用已有函数接口
// 结束条件,空指针
if (!root) {
return root;
}
// 单层递归逻辑,前序遍历
// 中间
std::swap(root->left, root->right);
invertTree(root->left); // 左边
invertTree(root->right); // 右边
return root;
}
};
【收获与时长】40m
101. 对称二叉树 (优先掌握递归)
【链接】(文章,视频,题目)
先看视频讲解,会更容易一些。
题目链接/文章讲解/视频讲解:代码随想录
【第一想法与实现(困难)】想不到
【看后想法】
- 其实是要判断左右子树对称。而两棵树对称,需要值相同,外侧子树对称、内侧子树对称
【实现困难】
【自写代码】
class Solution {
public:
bool isTwoTreesSymmetric(TreeNode* left, TreeNode* right) {
if (!left && !right) {
return true;
}
if ((!left && right) || (left && !right)) {
return false;
}
// 已经保证左右都非空,再判断值相等
if (left->val != right->val) {
return false;
}
// 左子树:左,右子树:右
bool is_outside_symmetric = isTwoTreesSymmetric(left->left, right->right);
// 左子树:右,右子树:左
bool is_inside_symmetric = isTwoTreesSymmetric(left->right, right->left);
// 左子树:中,右子树:中
return is_outside_symmetric && is_inside_symmetric;
}
bool isSymmetric(TreeNode* root) {
if (!root) {
return true;
}
// 两棵树对称,需要值相同,外侧子树对称、内侧子树对称
return isTwoTreesSymmetric(root->left, root->right);
}
};
【收获与时长】30m