欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

【LeetCode】二叉树层次遍历 (一次让人疯掉的超低级bug)

这一句加了一个分号!结果如论如何都不对,在我把代码拷贝到vs2013中执行也一样,其实在vs中build完毕之后有一个warning:告诉我这里有一个分号,还问是不是本意?!看来waring也是蛮重要的。