【LeetCode】二叉树层次遍历 (一次让人疯掉的超低级bug)
程序员文章站
2022-06-05 19:06:20
...
我对递归的思想有点犯怵,递归这个东西确实需要天赋和训练。所以二叉树遍历我首先掌握的是迭代方法。
层次遍历的基本思路是,因为要从上到下,从左到右进行遍历,我们进行碰到数据的过程和要处理的过程方向是一致的,所以最好使用队列queue数据结构:在while循环中,每处理一个数据,一次把它的左子节点(如果有的话)和右子节点(如果有的话)入队,直到队列变空。
LeetCode上这一题,不仅要按正确的方式(层次遍历)进行遍历,还要获取每个结点在第几层,也就是输出的是一个vector<vector<int>>, 每一个元素也是一个vector,代表了一层的所有数据。因此相比MOOC课堂上增加了一定的难度。针对这一增加的难度,我的处理方式是,入队的不只是节点,而是一个pair类型的数据,其first是节点,second是所在的层号level;在每一次循环将要结束之前,记录的是是本次访问数据的层号,也是下次要进行访问数据之前,跟访问数据的层号进行对比的层号,如果二者不同,表明已经遍历到一个新层,因此返回的result要push_back一个vector<int>。
详细代码如下:
/**
* 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)
{
int level = 0;
int a = 2;
int b = 5;
int c = 98;
cout << "level, a, b, c:" << a<<" " << b<< " " << c<<" " <<level <<endl;
queue<pair<TreeNode*, int>> q_node;
vector< vector<int> > result;
if (!root)
{
result.clear();
return result;
}
q_node.push(make_pair(root, 0));
vector<int> first_vector;
result.push_back(first_vector);
int count = 0; // 记录目前处理正在处理的层次,以跟下一个循环的节点层次进行对比
while(q_node.size())
{
auto cur_node_level = q_node.front();
int level = cur_node_level.second;
// 比较当前处理的是否跟上一次处理的层级相等,如果不是,则表明出现了新层级,result要增加元素
if (level != count)
{
cout << level << " and " << count <<endl;
vector<int> cur_vector;
result.push_back(cur_vector);
}
result[level].push_back((cur_node_level.first)->val);
q_node.pop();
if(cur_node_level.first->left)
q_node.push(make_pair(cur_node_level.first->left, level+1));
if(cur_node_level.first->right)
q_node.push(make_pair(cur_node_level.first->right, level+1));
count = level;
}
return result;
}
};
要重点做一个记录的是这次喷到的一个超级低级bug,我大意之下在if (level != count);
这一句加了一个分号!结果如论如何都不对,在我把代码拷贝到vs2013中执行也一样,其实在vs中build完毕之后有一个warning:告诉我这里有一个分号,还问是不是本意?!看来waring也是蛮重要的。