102.二叉树的层序遍历
写的时后没有注意检查左右子节点是否为空,要注意!!
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> nodes;
vector<vector<int>> result;
if(root) nodes.push(root);
while(!nodes.empty()){
vector<int> vec;
int size = nodes.size();
for(int i = 0; i < size; i++){
TreeNode* cur = nodes.front();
nodes.pop();
vec.push_back(cur->val);
if(cur->left) nodes.push(cur->left);
if(cur->right) nodes.push(cur->right);
}
result.push_back(vec);
}
return result;
}
};
107.二叉树的层次遍历II
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> result;
queue<TreeNode*> q;
if(!root) return result;
q.push(root);
while(!q.empty()){
int size = q.size();
vector<int> varOfLayer;
for(auto i = 0; i < size; i++){
TreeNode* node = q.front();
q.pop();
varOfLayer.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
result.push_back(varOfLayer);
}
reverse(result.begin(),result.end());
return result;
}
};
199.二叉树的右视图
第一的想法是,queue不放左节点了。但是左节点可能比右节点有更多的子子孙孙节点,这样可能就会因此漏掉。用stack来存放所有层的元素则完美解决,且最上层的元素即是当前最右边的元素。
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> result;
queue<TreeNode*> q;
if(!root) return result;
q.push(root);
while(!q.empty()){
auto size = q.size();
stack<int> temp;
for(int i = 0; i < size; i++){
TreeNode* node = q.front();
q.pop();
temp.push(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
result.push_back(temp.top());
}
return result;
}
};
637.二叉树的层平均值
class Solution {
public:
vector<double> averageOfLevels(TreeNode* root) {
vector<double> result;
queue<TreeNode*> q;
// 检查空节点
if(!root) return result;
q.push(root);
while(!q.empty()){
int size = q.size();
double sum = 0;
for(auto i = 0; 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);
}
result.push_back(sum / size);
}
return result;
}
};
429. N 叉树的层序遍历
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
vector<vector<int>> result;
queue<Node*> q;
if(!root) return result;
q.push(root);
while(!q.empty()){
auto size = q.size();
vector<int> vec;
for(int i = 0; i < size; i++){
Node* node = q.front();
q.pop();
vec.push_back(node->val);
for(auto child : node->children){
q.push(child);
}
}
result.push_back(vec);
}
return result;
}
};
515. 在每个树行中找最大值
class Solution {
public:
vector<int> largestValues(TreeNode* root) {
vector<int> result;
queue<TreeNode*> q;
if(!root) return result;
q.push(root);
while(!q.empty()){
auto size = q.size();
int min = INT32_MIN;
for(int i = 0; i < size; i++){
TreeNode* node = q.front();
q.pop();
min = node->val > min ? node->val : min;
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
result.push_back(min);
}
return result;
}
};
116. 填充每个节点的下一个右侧节点指针
很巧妙,需要检查 i != size - 1。不然next将会指向下一层。
class Solution {
public:
Node* connect(Node* root) {
if(!root) return root;
queue<Node*> q;
q.push(root);
while(!q.empty()){
auto size = q.size();
for(auto i = 0; i < size; i++){
Node* node = q.front();
q.pop();
if(i != size - 1) node->next = q.front();
else node->next = NULL;
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return root;
}
};
117.填充每个节点的下一个右侧节点指针II
跟116一模一漾
class Solution {
public:
Node* connect(Node* root) {
if(!root) return root;
queue<Node*> q;
q.push(root);
while(!q.empty()){
auto size = q.size();
for(auto i = 0; i < size; i++){
Node* node = q.front();
q.pop();
if(i != size - 1) node->next = q.front();
else node->next = NULL;
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return root;
}
};
104. 二叉树的最大深度
class Solution {
public:
int maxDepth(TreeNode* root) {
if (!root) return 0;
int depth = 0;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()) {
int size = q.size();
depth++;
for (int i = 0; i < size; i++) {
TreeNode* node = q.front();
q.pop();
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
return depth;
}
};
111.二叉树的最小深度
不是很懂,先跳过
class Solution {
public:
int minDepth(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);
if (!node->left && !node->right) { // 当左右孩子都为空的时候,说明是最低点的一层了,退出
return depth;
}
}
}
return depth;
}
};
226.翻转二叉树
递归
class Solution {
public:
void traverse(TreeNode* node){
//检查是否是空指针
if(!node) return;
swap(node->left, node->right);
if(node->left) traverse(node->left);
if(node->right) traverse(node->right);
}
TreeNode* invertTree(TreeNode* root) {
traverse(root);
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;
}
};
101. 对称二叉树
class Solution {
public:
bool compare(TreeNode* left, TreeNode* right){
// 判断当前在同一层对应的两个节点对不对称
// 先判断若有空节点的情况
if(left == nullptr && right != nullptr) return false;
else if (left != nullptr && right == nullptr) return false;
else if (left == nullptr && right == nullptr) return true;
// 若都不是空节点,只剩一种情况不对称,那就是值不同则return false
else if (left->val != right->val) return false;
// 判断下层是否对称
// 最左边对应最右边(外侧)
// 内侧对应
bool outside = compare(left->left, right->right);
bool inside = compare(left->right, right->left);
return outside && inside;
}
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return compare(root->left, root->right);
}
};