层序遍历
层序遍历需要借助队列实现,其主要结构为
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>res;
for(int i=0;i<size;i++)
{
TreeNode* cur=que.front();
que.pop();
res.push_back(cur->val);
if(cur->left) que.push(cur->left);
if(cur->right) que.push(cur->right);
}
result.push_back(res);
}
return result;
}
};
通过上述基本结构,用于完成以下10道题。
107 层序遍历2 该题中,我们只需要在末尾加入一个reverse函数,将原本的结果翻转即可。
199 二叉树右视图该题,我们仍然采用层序遍历算法,需要改动的是,我们只需要记下每一层的最后一个节点即可。无需将该层所有的节点记下。
637 二叉树的层平均值
429 N叉树的层序遍历
515 在每个树行中找最大值
116 填充每个节点的下一个右侧节点指针 进阶版的解答还没认真思考,下次补上代码。
104 二叉树的最大深度
111 二叉树的最小深度 我们只需要判断当前节点的左右节点是否为空,如果为空,则直接返回它的深度即可。
翻转二叉树
题目链接: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) {
stack<TreeNode*>st;
if(root==NULL) return root;
st.push(root);
while(!st.empty())
{
TreeNode* cur=st.top();
if(cur!=NULL)
{
st.pop();
if(cur->right)st.push(cur->right);
if(cur->left)st.push(cur->left);
st.push(cur);
st.push(NULL);
}
else{
st.pop();
cur=st.top();
swap(cur->left,cur->right);
st.pop();
}
}
return root;
}
};
101 对称二叉树
题目链接:101 对称二叉树
题目描述:给你一个二叉树的根节点 root , 检查它是否轴对称。
解题思路:
一般来说判断是否为对称的,需要判断以下几个方面
- 左右子树都为空,对称
- 左子树不为空,右子树为空,不对称
- 左子树为空,右子树不为空,不对称
- 左右子树的值不同,不对称
- 记下判断左子树的左子树和右子树的右子树,左子树的右子树和右子树的左子树。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==NULL) return true;
return compare(root->left,root->right);
}
bool compare(TreeNode* left,TreeNode*right)
{
if(left==NULL&&right==NULL) return true;
else if(left!=NULL&&right==NULL) return false;
else if(left==NULL&&right!=NULL) return false;
else if(left->val!=right->val) return false;
else return compare(left->left,right->right)&&compare(left->right,right->left);
}
};