如何平衡二叉搜索树(BST)?解决LeetCode题C++代码ASAN报错问题
报错翻译
=================================================================
30错误:地址消毒工具(AddressSanitizer)检测到栈内存越界访问:访问地址0x7ffc15eb8028,程序计数器0x000000374488,栈基址0x7ffc15eb7dd0,栈指针0x7ffc15eb7dc8
线程T0在此地址执行8字节读操作
#5 0x7fac728370b2 (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
地址0x7ffc15eb8028位于线程T0的栈空间内,偏移72,对应栈帧中存在1个对象:
[32, 112) 'q' <== 访问的偏移72位于此变量内部
提示:如果你的程序使用了自定义栈展开机制、swapcontext或vfork,此报错可能是误报
(longjmp和C++异常是被支持的)
问题根因分析
- 中序遍历参数传递错误:
inOrder函数的vector<int> bst参数为值传递,函数内部对bst的修改仅作用于临时副本,不会同步到外层定义的sortedBST,最终sortedBST是空数组,后续访问sortedBST[mid]直接触发数组越界,这是报错的核心原因。修复方式是将参数改为引用传递:void inOrder(TreeNode* root, vector<int>& bst) - 野指针未初始化:
TreeNode* balancedBST;定义时未初始化,属于值不确定的野指针,后续if (balancedBST == NULL)的判断结果完全不可预期,会触发非法内存访问。修复方式是初始化为空指针:TreeNode* balancedBST = nullptr; - 平衡树构建逻辑错误:你当前逐个取有序数组中间元素插入BST的逻辑,不仅时间复杂度高(每次erase数组元素是O(n),插入BST是O(logn),整体复杂度O(n²)),且最终得到的树也不保证满足平衡要求。正确的构建逻辑应该是对有序数组递归拆分:每次取当前区间的中点作为根节点,左半区间递归构建左子树,右半区间递归构建右子树,天然满足平衡二叉搜索树的特性,时间复杂度为O(n)。
- 无效判断逻辑冗余:
if (size % 2 == 1 || size % 2 == 0)是恒成立的条件,没有实际作用,可以直接删除。
修复后完整代码
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: // 改为引用传递 void inOrder(TreeNode* root, vector<int>& bst) { if (root != nullptr) { inOrder(root->left, bst); bst.push_back(root->val); inOrder(root->right, bst); } } // 递归构建平衡BST TreeNode* build(int left, int right, vector<int>& sortedArr) { if(left > right) return nullptr; int mid = left + (right - left) / 2; TreeNode* root = new TreeNode(sortedArr[mid]); root->left = build(left, mid - 1, sortedArr); root->right = build(mid + 1, right, sortedArr); return root; } TreeNode* balanceBST(TreeNode* root) { vector<int> sortedBST; inOrder(root, sortedBST); return build(0, sortedBST.size() - 1, sortedBST); } };
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

