第一题层序遍历。熟悉套路之后没什么问题,还把后面十道题都做了。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
vector<vector<int>> result;
if(root == nullptr) return result;
que.push(root);
while(!que.empty()){
int size =que.size();
vector<int> record;
while(size --){
TreeNode* cur = que.front();
que.pop();
record.push_back(cur->val);
if(cur->left) que.push(cur->left);
if(cur->right) que.push(cur->right);
}
result.push_back(record);
}
return result;
}
};
第二题 翻转二叉树
使用的是递归的方法,还是比较好理解的
1.考虑终止条件,
2.考虑每一步的迭代内容
3.考虑返回值。
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) {
queue<TreeNode*> que;
if(root == nullptr) return root;
que.push(root);
while(!que.empty()){
TreeNode *cur = que.front(); que.pop();
swap(cur->left,cur->right);
if(cur->left) que.push(cur->left);
if(cur->right) que.push(cur->right);
}
return root;
}
};
第三题 对称二叉树
看着答案写了两遍总算是写出来了。。。
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* leftnode = que.front(); que.pop();
TreeNode* rightnode = que.front(); que.pop();
if(!leftnode && !rightnode) continue;
if(!leftnode && rightnode) return false;
if(leftnode && !rightnode) return false;
if(leftnode->val != rightnode-> val) return false;
que.push(leftnode->left);
que.push(rightnode->right);
que.push(leftnode->right);
que.push(rightnode->left);
}
return true;
}
};