层序遍历
102. 二叉树的层序遍历
题目1链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
视频讲解:讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历_哔哩哔哩_bilibili
文章讲解:代码随想录
/**
* 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) {
queue<TreeNode*> que;
vector<vector<int>> result;
if(root!=NULL) que.push(root);
while(!que.empty()){
int size = que.size();
vector<int> vec; // 用来存放一层的数组
while(size--){
TreeNode* cur = que.front();
que.pop();
vec.push_back(cur->val);
if(cur->left!=NULL) que.push(cur->left);
if(cur->right!=NULL) que.push(cur->right);
}
result.push_back(vec);
}
return result;
}
};
107. 二叉树的层次遍历II
题目2链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录 (programmercarl.com)
**
* 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>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> result;
queue<TreeNode*> que;
if(root!=NULL) que.push(root);
while(!que.empty()){
int size = que.size();
vector<int> vec;
while(size--){
TreeNode* cur = que.front();
que.pop();
vec.push_back(cur->val);
if(cur->left!=NULL) que.push(cur->left);
if(cur->right!=NULL) que.push(cur->right);
}
result.push_back(vec);
}
reverse(result.begin(),result.end());
return result;
}
};
199.二叉树的右视图
题目3链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录 (programmercarl.com)
自己做没想出来,力扣上的中等题就没想到了
层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。
/**
* 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<int> rightSideView(TreeNode* root) {
vector<int> result;
// 还是层序遍历
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();
if(i==size-1) result.push_back(node->val); // 将每一层的最后元素放入result数组中
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return result;
}
};
637. 二叉树的层平均值
题目4链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录 (programmercarl.com)
这个自己一遍就写出来了
/**
* 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<double> averageOfLevels(TreeNode* root) {
vector<double> result;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()){
int size = que.size();
int count = size;
double average = 0;
while(count--){
TreeNode* cur = que.front();
que.pop();
average += cur->val;
if(cur->left) que.push(cur->left);
if(cur->right) que.push(cur->right);
}
average /= size;
result.push_back(average);
}
return result;
}
};
429. N叉树的层序遍历
题目5链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录 (programmercarl.com)
这个自己一遍就写出来了
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val) {
val = _val;
}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
vector<vector<int>> result;
queue<Node*> que;
if(root!=NULL) que.push(root);
while(!que.empty()){
int size = que.size();
vector<int> vec;
while(size--){
Node* cur = que.front();
que.pop();
vec.push_back(cur->val);
vector<Node*> children = cur->children;
for(int i=0; i<children.size(); i++){
que.push(children[i]);
}
}
result.push_back(vec);
}
return result;
}
};
515. 在每个树行中找最大值
题目6链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录 (programmercarl.com)
注意要自己手动求解最大值
/**
* 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<int> largestValues(TreeNode* root) {
vector<int> result;
queue<TreeNode*> que;
if(root!=NULL) que.push(root);
while(!que.empty()){
int size = que.size();
int maxValue = INT_MIN; // C++中常量INT_MAX和INT_MIN分别表示最大、最小整数,定义在头文件limits.h中。
while(size--){
TreeNode* cur = que.front();
que.pop();
maxValue = cur->val > maxValue ? cur->val : maxValue;
if(cur->left!=NULL) que.push(cur->left);
if(cur->right!=NULL) que.push(cur->right);
}
result.push_back(maxValue);
}
return result;
}
};
116. 填充每个节点的下一个右侧节点指针
题目7链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录 (programmercarl.com)
这个自己一遍就写出来了
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() : val(0), left(NULL), right(NULL), next(NULL) {}
Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
Node(int _val, Node* _left, Node* _right, Node* _next)
: val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
public:
Node* connect(Node* root) {
queue<Node*> que;
if(root!=NULL) que.push(root);
while(!que.empty()){
int size = que.size();
vector<Node*> vec;
while(size--){
Node* cur = que.front();
que.pop();
vec.push_back(cur);
if(cur->left!=NULL) que.push(cur->left);
if(cur->right!=NULL) que.push(cur->right);
}
Node* tmp = NULL;
vec.push_back(tmp);
for(int i=0; i<vec.size()-1; i++){
vec[i]->next = vec[i+1];
}
}
return root;
}
};
117. 填充每个节点的下一个右侧节点指针II
题目8链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录 (programmercarl.com)
在之前代码的逻辑下跟上题没区别
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() : val(0), left(NULL), right(NULL), next(NULL) {}
Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
Node(int _val, Node* _left, Node* _right, Node* _next)
: val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
public:
Node* connect(Node* root) {
queue<Node*> que;
if(root!=NULL) que.push(root);
while(!que.empty()){
int size = que.size();
vector<Node*> vec;
while(size--){
Node* cur = que.front();
que.pop();
vec.push_back(cur);
if(cur->left!=NULL) que.push(cur->left);
if(cur->right!=NULL) que.push(cur->right);
}
Node* tmp = NULL;
vec.push_back(tmp);
for(int i=0; i<vec.size()-1; i++){
vec[i]->next = vec[i+1];
}
}
return root;
}
};
104. 二叉树的最大深度
题目9链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录 (programmercarl.com)
简单
/**
* 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:
int maxDepth(TreeNode* root) {
if(root==NULL) return 0;
queue<TreeNode*> que;
que.push(root);
int deepth = 0;
while(!que.empty()){
int size = que.size();
deepth += 1;
while(size--){
TreeNode* cur = que.front();
que.pop();
if(cur->left) que.push(cur->left);
if(cur->right) que.push(cur->right);
}
}
return deepth;
}
};
111. 二叉树的最小深度
题目10链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录 (programmercarl.com)
简单
/**
* 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:
int minDepth(TreeNode* root) {
if(root==NULL) return 0;
queue<TreeNode*> que;
que.push(root);
int depth = 0;
while(!que.empty()){
int size = que.size();
depth += 1;
while(size--){
TreeNode* cur = que.front();
que.pop();
if(!(cur->left||cur->right)) return depth;
if(cur->left) que.push(cur->left);
if(cur->right) que.push(cur->right);
}
}
return depth;
}
};
226. 翻转二叉树
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
视频讲解:听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树_哔哩哔哩_bilibili
文章讲解:代码随想录
翻转二叉树就是以中轴线两两交换左右孩子
【优先掌握递归法】
/**
* 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:
TreeNode* invertTree(TreeNode* root) {
if(root==NULL) return root;
// 前序遍历:中左右,对于中结点交换其两个孩子
swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);
// 把swap放在下面就是后序遍历
// 中序的话放在中间,改成处理两遍左子树
return root;
}
};
101. 对称二叉树
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
视频讲解:新学期要从学习二叉树开始! | LeetCode:101. 对称二叉树_哔哩哔哩_bilibili
文章讲解:代码随想录
/**
* 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:
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 result = outside && inside;
return result;
}
bool isSymmetric(TreeNode* root) {
if(root==NULL) return true;
return compare(root->left, root->right);
}
};