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

runtime error while merging 2 binary trees

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

    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;
    }
};

此代码产生以下错误

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

但是,如果我尝试在不使用额外的 TreeNode 的情况下解决问题,如下所示,它工作正常

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

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

在此代码中

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 是一个错误。

大概你的意思是这样的

TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
    if(t1==nullptr){return t2;}
    if(t2==nullptr){return t1;}
    TreeNode *t = new TreeNode;
    t->val=t1->val+t2->val;
  • 确实解决了这个问题。
  • 然而我们仍然可以稍微简化一下我们的陈述:
// 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 的指针,那么您应该在写入 TreeNode *t; 之后添加 t = new TreeNode;。希望能奏效:)