代码随想录算法训练营Day15 | 层序遍历 10 226.翻转二叉树 101.对称二叉树 2
层序遍历 10
思路:
1.用queue收集left和right节点,并push front节点。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> que;
if(!root) return res;
que.push(root);
while(!que.empty()){
int size = que.size();
vector<int> vec;
for(int i=0; i<size; i++){
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
res.push_back(vec);
}
return res;
}
};
思路:
反向输出正序即可
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
queue<TreeNode*> que;
vector<vector<int>> res;
if (root) que.push(root);
while(!que.empty()){
vector<int> vec;
int size = que.size();
for(int i=0; i<size;i++){
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
res.push_back(vec);
}
reverse(res.begin(), res.end());
return res;
}
};
题目链接:LeetCode 199.二叉树的右视图
思路:
1.push最后一个值
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
queue<TreeNode*> que;
vector<int> res;
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.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return res;
}
};
思路:
求mean;
class Solution {
public:
vector<double> averageOfLevels(TreeNode* root) {
queue<TreeNode*> que;
vector<double> res;
if (root) que.push(root);
while(!que.empty()){
int size = que.size();
double sum = 0;
for(int i=0; i<size;i++){
TreeNode* node = que.front();
que.pop();
sum += node->val;
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
res.push_back(sum/size);
}
return res;
}
};
注意: 平均值变量为double
思路:
多节点
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
vector<vector<int>> res;
queue<Node*> que;
if(!root) return res;
que.push(root);
while(!que.empty()){
int size = que.size();
vector<int> vec;
for(int i=0; i<size; i++){
Node* node = que.front();
que.pop();
vec.push_back(node->val);
for(Node* child:node->children) que.push(child);
}
res.push_back(vec);
}
return res;
}
};
思路:
获取最大值
class Solution {
public:
vector<int> largestValues(TreeNode* root) {
queue<TreeNode*> que;
vector<int> res;
if (root) que.push(root);
while(!que.empty()){
int size = que.size();
int max = INT32_MIN;
for(int i=0; i<size;i++){
TreeNode* node = que.front();
que.pop();
if(node->val > max) max=node->val;
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
res.push_back(max);
}
return res;
}
};
题目链接:LeetCode 116.填充每个节点的下一个右侧节点指针
思路:
1.用Node pre记录前一个节点,将其指向下一个节点;、
2.最后一个节点需要指向NULL
class Solution {
public:
Node* connect(Node* root) {
queue<Node*> que;
if (!root) return root;
que.push(root);
while(!que.empty()){
int size = que.size();
Node* node;
Node* preNode;
for(int i=0; i<size; i++){
if(i==0){
preNode = que.front();
que.pop();
node = preNode;
}
else{
node = que.front();
que.pop();
preNode->next = node;
preNode = preNode->next;
}
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
preNode->next = NULL;
}
return root;
}
};
题目链接:LeetCode 117.填充每个节点的下一个右侧节点指针II
思路:同116
class Solution {
public:
Node* connect(Node* root) {
queue<Node*> que;
if(!root) return root;
que.push(root);
while(!que.empty()){
Node* node;
Node* prenode;
int size = que.size();
for (int i=0; i<size; i++){
if(i==0){
prenode = que.front();
que.pop();
node = prenode;
}
else{
node = que.front();
que.pop();
prenode->next = node;
prenode = prenode->next;
}
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return root;
}
};
思路:
层次遍历每个循环记录depth
class Solution {
public:
int maxDepth(TreeNode* root) {
queue<TreeNode*> que;
int depth = 0;
if(!root) return depth;
que.push(root);
while(!que.empty()){
int size = que.size();
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);
}
depth ++;
}
return depth;
}
};
思路:
如果没有左右节点就return
class Solution {
public:
int minDepth(TreeNode* root) {
queue<TreeNode*> que;
int depth = 0;
if(!root) return depth;
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&&!node->right) return depth;
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return depth;
}
};
LeetCode 226.翻转二叉树
题目链接:LeetCode 226.翻转二叉树
思路:
递归
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(!root) return root;
swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
};
注意 :
- 注意return root
LeetCode 101. 对称二叉树
题目链接:LeetCode 101. 对称二叉树
思路:
1.自定义compare函数,如果left和right一空一非空,false;两空,true
2.遍历即可
class Solution {
public:
bool compare(TreeNode* left, TreeNode* right){
if(!left&&right) return false;
else if(!right&&left) return false;
else if(!right&&!left) return true;
else if(left->val!=right->val) return false;
else return compare(left->left,right->right) && compare(left->right,right->left);
}
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return compare(root->left,root->right);
}
};