给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树:[3,9,20,null,null,15,7]
,3 / \ 9 20 / \ 15 7返回其层次遍历结果:
[ [3], [9,20], [15,7] ]
解法一:
//时间复杂度O(n), 空间复杂度O(n)
/**
* Definition for a binary tree node.
* 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) {
if(!root) return {};
queue<TreeNode*> q1, q2;
q1.push(root);
vector<vector<int>> res;
while(!q1.empty()) {
q2.swap(q1);
res.push_back(vector<int>());
while(!q2.empty()) {
TreeNode* temp = q2.front();
q2.pop();
res[res.size() - 1].push_back(temp->val);
if(temp->left) q1.push(temp->left);
if(temp->right) q1.push(temp->right);
}
}
return res;
}
};
解法二:
//时间复杂度O(n), 空间复杂度O(n)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void levelOrder(TreeNode* root, int level, vector<vector<int>>& res) {
if(level == res.size()) res.push_back(vector<int>());
res[level].push_back(root->val);
if(root->left) levelOrder(root->left, level + 1, res);
if(root->right) levelOrder(root->right, level + 1, res);
}
vector<vector<int>> levelOrder(TreeNode* root) {
if(!root) return {};
vector<vector<int>> res;
levelOrder(root, 0, res);
return res;
}
};
解法一:
迭代法。使用两个队列q1和q2,q1存放要遍历的层的结点,q2存放下一层的结点,这样便于分层。也可以只用一个队列,这时需要维护一个计数变量,记下当前层的个数以区分不同层。细节见代码。
解法二:
递归法。先序遍历整棵树,记下当前递归的层数level,按层数level把root->val插入到res中合适的位置。
2019/11/16 12:43