代码随想录打卡day15
二叉树2
1.102二叉树的层序遍历(广度优先搜索)
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
vector<vector<int>> result;
if(root != nullptr) que.push(root);//操作节点时首先要判断是不是为空,不能操作空指针
while(!que.empty()){
int size = que.size();
vector<int> level_n;//这个定义在循环内部,因为每次遍历一层都要把这个存入,定义在外面每次要清空一次,否则push进结果里面操作麻烦一些
while(size--){
TreeNode* temp = que.front();
que.pop();
level_n.push_back(temp->val);
if(temp->left){
que.push(temp->left);
}
if(temp->right){
que.push(temp->right);
}
}
result.push_back(level_n);
}
return result;
}
};
2.leetcode226翻转二叉树
递归
//递归
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) {
stack<TreeNode*> st;
if(root == nullptr) return root;
st.push(root);
while(!st.empty()){
TreeNode* temp = st.top();
st.pop();
swap(temp->left, temp->right);
if(temp->right) st.push(temp->right);
if(temp->left) st.push(temp->left);
}
return root;
}
};
层序遍历
//层序遍历
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
queue<TreeNode*> que;
if(root == nullptr) return root;
que.push(root);
while(!que.empty()){
int size = que.size();
while(size--){
TreeNode* temp = que.front();
que.pop();
swap(temp->left, temp->right);
if(temp->right) que.push(temp->right);
if(temp->left) que.push(temp->left);
}
}
return root;
}
};
3.leetcode101对称二叉树
class Solution {
public:
bool isSymmetric(TreeNode* root) {
queue<TreeNode*> que;
if(root == nullptr) return true;
que.push(root->left);
que.push(root->right);
while(!que.empty()){
TreeNode* tempL = que.front();
que.pop();
TreeNode* tempR = que.front();
que.pop();
if(tempL == nullptr && tempR == nullptr){
continue;
}
if(tempL == nullptr && tempR != nullptr || tempR == nullptr && tempL != nullptr || tempL->val != tempR->val){
return false;//这处判断条件前两个都可以简化,因为经过上个if后只用判断这两个有一个为空则另一个一定不空
//其次注意这三个“或”的顺序,最后一个取值一定要放后面,程序顺序执行发现前面的空指针时则不会继续有templ->val这种操作空指针的操作了
}
que.push(tempL->left);
que.push(tempR->right);
que.push(tempL->right);
que.push(tempR->left);
}
return true;
}
};