LeetCode层序遍历出现vector空指针引用运行时错误该如何解决?
报错根因
- 你预先给结果vector
ans固定了4行4列的大小,当二叉树的深度大于4,或者任意一层的节点数量大于4时,对ans[row][col]的赋值操作会触发数组越界,属于未定义行为,才会出现STL vector的空指针绑定报错。 - 代码存在逻辑错误:赋值节点值时错误使用了根节点
node->val,而非当前遍历到的节点temp->val,会导致所有存储的节点值都是根节点的值。 - 列索引
col定义后没有自增逻辑,同一层的所有节点都会被写到相同下标位置,逻辑完全错误。
更合理的实现思路
不用提前设定vector的大小,采用动态扩容的方式处理分层:
- 不需要用NULL作为层分隔符,每次遍历队列前先取队列当前的长度,这个长度就是当前层的节点总数
- 每开始处理新的一层时,先往
ans中push一个空的一维vector,再遍历当前层的所有节点,把节点值逐个push到当前层的vector中即可,无需手动维护行、列索引
修正后的完整代码
class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> ans; // 特判根节点为空的边界情况 if (root == nullptr) return ans; queue<TreeNode*> q; q.push(root); while (!q.empty()) { // 获取当前层的节点总数 int levelSize = q.size(); // 新增空数组存储当前层节点值 ans.push_back(vector<int>()); // 遍历当前层所有节点 for (int i = 0; i < levelSize; ++i) { TreeNode* curr = q.front(); q.pop(); ans.back().push_back(curr->val); // 子节点入队 if (curr->left != nullptr) q.push(curr->left); if (curr->right != nullptr) q.push(curr->right); } } return ans; } };
内容的提问来源于stack exchange,提问作者Badal_01
相关产品推荐
相关产品推荐

