You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何平衡二叉搜索树(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:27:02