题目
思路
二叉树的层次遍历有两种方法,分别是迭代法和递归法
迭代法
迭代法主要用到队列,将下一层的元素放到队列尾部,从队列首部弹出元素,代码如下
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root==NULL)
return res;
deque<TreeNode*> d;
d.push_back(root);
while (!d.empty()) {
vector<int> v;
int num = d.size();
for (int i = 0; i < num; i++) {//使用内循环弹出同一层次的元素
TreeNode* node = d.front();
d.pop_front();
v.push_back(node->val);
if (node->left) d.push_back(node->left);
if (node->right) d.push_back(node->right);
}
res.push_back(v);
}
return res;
}
};
递归法
- 先用递归求出二叉树的高度
- 然后再递归的写进容器
class Solution {
public:
vector<vector<int>>ans;
vector<vector<int>> levelOrder(TreeNode* root) {
if(!root) return ans;
int n=howlen(root);
ans.resize(n);
levelOrder(root,0);
return ans;
}
void levelOrder(TreeNode* root,int n){//n为此时节点所在的层,根节点为第零层,每次递归都加1
ans[n].push_back(root->val);
if(root->left) levelOrder(root->left,n+1);
if(root->right) levelOrder(root->right,n+1);
}
int howlen(TreeNode* root){//用递归求树的总层数
if(root==NULL) return 0;
return max(howlen(root->left),howlen(root->right))+1;
}
};