层序遍历
102.二叉树的层序遍历
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
queue<TreeNode*> que;
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();//pop当前结点
vec.push_back(node->val);//把当前结点值push进vec
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
result.push_back(vec);//把该层数组push入result
}
return result;
}
};
107.二叉树的层次遍历 II
和上一题的区别就是,加了一个reverse把result的结果反转一下
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
queue<TreeNode*> que;
if(root != NULL) que.push(root);
vector<vector<int>> result;
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);
}
reverse(result.begin(),result.end());
return result;
}
};
199.二叉树的右视图
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
queue<TreeNode*> que;
if(root != NULL) que.push(root);
vector<int> result;
while(!que.empty())
{
int size = que.size();
for(int i = 0;i < size;i++)
{
TreeNode* node = que.front();
que.pop();
if (i == (size - 1)) result.push_back(node->val); // 将每一层的最后元素放入result数组中
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
}
return result;
}
};
226.翻转二叉树
递归法-前序遍历
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) return root;
swap(root->left, root->right); // 先反转左右孩子结点
invertTree(root->left); // 左
invertTree(root->right); // 右
return root;
}
};
递归法-后续遍历
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root == NULL) return root;
invertTree(root->left);
invertTree(root->right);
swap(root->right,root->left);
return root;
}
};
迭代法
待补
101. 对称二叉树
class Solution {
public:
bool compare(TreeNode* left,TreeNode* right){
if(left == NULL && right == NULL) return true;//左右子树都空返回ture
else if(left != NULL && right == NULL) return false;//左右子树一个空一个不为空返回false
else if(left == NULL && right != NULL) return false;
else if(left->val != right->val) return false;//左右子树值不相等,返回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);
}
};