Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]
方法1:先根節點,在左右子樹進行遞歸,然後合併三者的結果---用時較長,方法不夠好
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int> > levelOrder(TreeNode *root) {
vector<vector<int> > ivv;
if(root!=NULL)
{
vector<vector<int> > ivvL,ivvR;
ivvL=levelOrder(root->left);//遞歸,得到左子樹的結果
ivvR=levelOrder(root->right);//遞歸,得到右子樹的結果
//合併根、左右子樹的結果到ivv
vector<int> ivROOT;
ivROOT.push_back(root->val);
ivv.push_back(ivROOT);//現將根元素放入
vector<vector<int> >::iterator iter1,iter2,iter3;
for( iter1=ivvL.begin(),iter2=ivvR.begin(); iter1!=ivvL.end() && iter2!=ivvR.end(); iter1++,iter2++)
{
(*iter1).insert((*iter1).end(),(*iter2).begin(),(*iter2).end());//合併到ivvL中的vector<int>對應元素中去
ivv.push_back(*iter1);
}
iter3=iter1==ivvL.end()?iter2:iter1;
for(; (iter3!=ivvL.end())&&(iter3!=ivvR.end()); iter3++)
ivv.push_back(*iter3);//將剩下的元素都加入進去
}
return ivv;
}
};
方法2:參考了戴同學的方法,直接利用層數作爲參數來傳遞是關鍵,速度快多了。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int> > levelOrder(TreeNode *root) {
vector<vector<int> > ivv;
traverse(root,0,ivv);
return ivv;
}
void traverse(TreeNode *root,int depth,vector<vector<int> > &ivv)
{
if(root!=NULL)
{
if(ivv.size()<depth+1)
{
vector<int> iv;
ivv.push_back(iv);
}
ivv[depth].push_back(root->val);
traverse(root->left,depth+1,ivv);
traverse(root->right,depth+1,ivv);
}
}
};