法一:
vector<vector<int>> levelOrder(TreeNode* root)
{
vector<vector<int>> res;
vector<int> tem; //临时vector
list<TreeNode*> l1; //存储节点list
list<int> l2; //存储对应节点深度信息list
if(!root)
return res;
l1.push_back(root);
l2.push_back(1);
int cur = 1; //当前深度
while(!l1.empty()) //list为空跳出循环
{
if(l1.front()->left)
{
l1.push_back(l1.front()->left);//有左孩子加l1中
l2.push_back(l2.front()+1); //对应的深度+1
}
if(l1.front()->right)
{
l1.push_back(l1.front()->right);//有右孩子加l1中
l2.push_back(l2.front()+1);//对应的深度+1
}
if(cur==l2.front())
tem.push_back(l1.front()->val); //深度相同,就加到tem中
else
{
res.push_back(tem); //深度不同,把之前的tem添加到res中
tem.clear();
cur++; //当前深度+1
tem.push_back(l1.front()->val);
}
l1.erase(l1.begin()); //每次循环移除l1头节点
l2.erase(l2.begin()); //每次循环移除l2头节点
}
res.push_back(tem);
return res;
}</span>
法二:
private:
vector<vector<int>> res;
public:
void buildVector(TreeNode * root,int depth)
{
if(!root)
return;
if(res.size()==depth)
res.push_back(vector<int>());
res[depth].push_back(root->val);
buildVector(root->left,depth+1);
buildVector(root->right,depth+1);
}
vector<vector<int>> levelOrder(TreeNode* root)
{
buildVector(root,0);
return res;
<span style="font-family: Arial, Helvetica, sans-serif;">}</span>