10 层序遍历
思路
队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
代码
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;
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);
}
result.push_back(vec);
}
return result;
}
};
总结
- 注意栈、队列为空的情况
- 另写类似十题(√)
226.翻转二叉树
思路
递归前序、后序可以解决,但是递归中序不行
层序遍历也可以解决
代码
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
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();
swap(node->left,node->right);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return root;
}
};
总结
- 递归中序不行(画图)是因为,比如递归到root时,交换左右子树,然后根据中序原理,要继续遍历root的右子树了,但此时的右子树已经是交换后的、原本的左子树了,所以会重复交换,而原先的右子树没有被遍历到
101.对称二叉树2
思路
递归三部曲
- 确定递归函数的参数列表和返回类型
- 确定递归函数的终止条件
- 确定单层递归逻辑
代码
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 != NULL && right != NULL) {
if(left->val != right->val) return false;
}
bool outside = compare(left->left,right->right);
bool inside = compare(left->right,right->left);
bool isSame = outside&&inside;
return isSame;
}
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
return compare(root->left,root->right);
}
};