Leetcode 102:二叉树的层次遍历
题目描述
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
我的解法:前序遍历思想
我的解法用的是二叉树前序遍历思想,用非迭代的方式遍历每一个节点,同时把节点和深度信息以二维类型压入堆栈,再根据节点的深度信息把节点的val存到二维vector的对应位置。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
TreeNode* p = root;
stack<pair<TreeNode*, int>> s;
int depth = 0;
vector<vector<int>> m;
int i = 0;
while(p!= NULL || !s.empty())
{
while(p != NULL)
{
s.push(pair<TreeNode*, int> (p, ++depth));
if(depth > m.size()) m.push_back(vector<int>());
m[depth-1].push_back(p->val);
p = p->left;
}
if(1) // or if(!s.empty())
{
p = s.top().first;
depth = s.top().second;
s.pop();
p = p->right;
}
}
return m;
}
};
其它解法1:用队列对二叉树进行非递归的逐层遍历
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(!root) return {};
vector<vector<int>> m;
queue<TreeNode*> q; q.push(root);
while(!q.empty())
{
vector<int> oneLevel;
//for(int i = 0; i < q.size(); i++) // 这个for语句是不对的,因为q的size一直在变
for(int i = q.size(); i > 0; i--)
{
TreeNode* t = q.front(); q.pop();
oneLevel.push_back(t->val);
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
m.push_back(oneLevel);
}
return m;
}
};
其它解法2:用上层数信息的递归(有点像我的解法)
我的解法是前序遍历,对每一个节点都存储了其深度信息,也可以说是层数,然后把节点的val值存到对应层的vector位置即可。
此解法类似,类似递归的前序遍历,每一次递归都有一个level变量,即层数信息。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
int level = 0;
vector<vector<int>> res;
levelOrder(root, level, res);
return res;
}
void levelOrder(TreeNode* node, int level, vector<vector<int>> &res)
{
if(!node) return;
if(res.size() == level) res.push_back({});
res[level].push_back(node->val);
levelOrder(node->left, level+1, res);
levelOrder(node->right, level+1, res);
}
};