合并2个二叉树时出现运行时错误

问题描述

我正在尝试通过leetcode解决merging binary trees问题。这是我的C ++代码

class Solution {
public:
    vector<int> assignBikes(vector<vector<int>>& ws,vector<vector<int>>& bs) {
        int n = ws.size(),m = bs.size();        
        vector<tuple<int,int,int>> dist;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int d = abs(ws[i][0]-bs[j][0]) + abs(ws[i][1]-bs[j][1]);
                dist.push_back(make_tuple(d,i,j)); 
            }
        }     
        sort(dist.begin(),dist.end(),cmp());
    }
    
    struct cmp {
         bool operator() (tuple<int,int>& t1,tuple<int,int>& t2) {
            int d1 = get<0>(t1),d2 = get<0>(t2),w1 = get<1>(t1),w2 = get<1>(t2),b1 = get<2>(t1),b2 = get<2>(t2);
            cout << d1 << " " << w1 << " " << b1 << " " << d2 << " " << w2 << " " << b2 ;
            bool ret = false;
            if (d1 < d2) ret = true;
            else if (w1 < w2) ret = true;
            else if (b1 < b2) ret = true;
            cout << " " << ret  << " " << endl;
            return ret;
        }
    };
};

int main() {
   Solution s;
   vector<vector<int>> ws = {{0,0},{1,{2,{3,{6,0}};
   vector<vector<int>> bs = {{0,999},0}};
   s.assignBikes(ws,bs);
}

此代码产生以下错误

    class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1,TreeNode* t2) {
        TreeNode *t;
        if(t1==nullptr){return t2;}
        if(t2==nullptr){return t1;}
        t->val=t1->val+t2->val;
        t->left=mergeTrees(t1->left,t2->left);
        t->right=mergeTrees(t1->right,t2->right);
        return t;
    }
};

但是,如果我尝试不使用额外的TreeNode来解决问题(如下所示),则效果很好

Line 18: Char 12: runtime error: member access within misaligned address 0x000000000001 for type 'TreeNode',which requires 8 byte alignment (solution.cpp)
0x000000000001: note: pointer points here
<memory cannot be printed>
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:27:12

有人可以解释为什么第一个代码导致错误吗?

解决方法

在此代码中

func showAlert() {
    let alert = UIAlertController(title: "Loaded ",message: "In webview currently",preferredStyle: .alert)
    DispatchQueue.main.asyncAfter(deadline: .now()+6.0) {
        self.present(alert,animated: true,completion: nil)
    }
}

TreeNode* mergeTrees(TreeNode* t1,TreeNode* t2) { TreeNode *t; if(t1==nullptr){return t2;} if(t2==nullptr){return t1;} t->val=t1->val+t2->val; 是未初始化的指针,因此t是错误。

大概你是说这样的

t->val
,
  • This确实解决了这个问题。
  • 不过,我们仍然可以在这里简化一下语句:
// The following block might slightly improve the execution time;
// Can be removed;
static const auto __optimize__ = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return 0;
}();

static const struct Solution {
    TreeNode* mergeTrees(
        TreeNode* t1,TreeNode* t2
    ) {
        if (t1 && t2) {
            TreeNode* root = new TreeNode(t1->val + t2->val);
            root->left = mergeTrees(t1->left,t2->left);
            root->right = mergeTrees(t1->right,t2->right);
            return root;
        }
        
        return t1 ? t1 : t2;
    }
};
,

您正在将't'初始化为指向TreeNode的指针,然后您应在编写t = new TreeNode;之后添加TreeNode *t;。希望能奏效:)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...