102 和103 都是层次遍历 ,不过103相对于102 有一个改变就是锯齿状,其实考虑一下就是把这一层的数据前后调换一下。层次遍历就是queue,先统计一下每层的节点数,然后把这些节点全部拿出来,再把下一层节点放入,一层一层遍历就可以。 第二个还有递归的解决方法,也是层次遍历,传的引用,然后操作一下vector数据就可以。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> vecTree;
if(root == nullptr)
return vecTree;
queue<TreeNode*> queTree;
queTree.push(root);
int count = 1;
while(!queTree.empty())
{
int TreeSize = queTree.size(); //统计这一层有多少个节点
int cnt = 0;
vector<int> vecTmp;
while(cnt < TreeSize) //遍历所有的节点,并且添加子节点
{
cnt++;
TreeNode* pNode = queTree.front();
queTree.pop();
vecTmp.push_back(pNode->val);
if(pNode->left)
{
queTree.push(pNode->left);
}
if(pNode->right)
{
queTree.push(pNode->right);
}
}
if((count&1) == 0) //如果是偶数层记得把vector Reverse一下,调换
reverse(vecTmp.begin(),vecTmp.end());
count++;
vecTree.push_back(vecTmp);
}
return vecTree;
}
};
vector<vector<int>> vecTree;
if(root == nullptr)
return vecTree;
dfs(vecTree,0,root);
for(int i = 1; i <vecTree.size();i+=2)
reverse(vecTree[i].begin(),vecTree[i].end());
return vecTree;
}
void dfs(vector<vector<int>> &vecTree,int deep, TreeNode* root)
{
if(root == nullptr)
return;
if(deep == vecTree.size()) // 如果当前高度等于数组大小,此时应该增加一个数组,
{
vector<int> vecTmp;
vecTree.push_back(vecTmp);
}
vecTree[deep].push_back(root->val);
dfs(vecTree,deep+1,root->left);
dfs(vecTree,deep+1,root->right);
}