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

我对递归的思想有点犯怵,递归这个东西确实需要天赋和训练。所以二叉树遍历我首先掌握的是迭代方法。

层次遍历的基本思路是,因为要从上到下,从左到右进行遍历,我们进行碰到数据的过程和要处理的过程方向是一致的,所以最好使用队列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也是蛮重要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值