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); } } };