层序遍历
队列的思想。
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
if(root!=nullptr) que.push(root);
vector<vector<int> > result;
while(!que.empty())
{
vector<int> tmp;
int size=que.size();
for(int i=0;i<size;i++)
{
TreeNode *node=que.front();
que.pop();
tmp.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
result.push_back(tmp);
}
return result;
}
};
leetcode107
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
queue<TreeNode*> que;
if(root!=nullptr) que.push(root);
vector<vector<int> > result;
while(!que.empty())
{
vector<int> tmp;
int size=que.size();
for(int i=0;i<size;i++)
{
TreeNode *node=que.front();
que.pop();
tmp.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
result.push_back(tmp);
}
reverse(result.begin(),result.end());
return result;
}
};
leetcode 199
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
queue<TreeNode*> que;
if(root!=nullptr)
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);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return result;
}
};
有一个要注意的点:que.size()的值随时都在变化,所以应该需要一个size去记录,而不是直接用que.size()。
226.翻转二叉树
这道题不能中序遍历!
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) {
if(root==nullptr) return root;
invertTree(root->left);
invertTree(root->right);
swap(root->left,root->right);
return root;
}
};
对称二叉树2
牢记递归三板斧:
确定函数参数和返回值。
确定终止条件。
确定单层递归逻辑
在这道题我们实际上是后序遍历,因为需要左右子树的比较完成把结果传递给根节点我们才能确定这两个子树是否相等。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (root==nullptr) return true;
return compare(root->left,root->right);
}
bool compare(TreeNode *left,TreeNode*right)
{
if(left==nullptr&&right!=nullptr) return false;
if(left!=nullptr&&right==nullptr) return false;
if(left==nullptr&&right==nullptr) return true;
if(left->val!=right->val) return false;
bool outside=compare(left->left,right->right);
bool inside=compare(left->right,right->left);
bool result=outside&&inside;
return result;
}
};