【问题标题】:runtime error while merging 2 binary trees合并 2 个二叉树时出现运行时错误
【发布时间】:2020-12-28 06:59:23
【问题描述】:

我正在尝试解决 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 classstruct 的声明和定义。
  • 好吧,准确地说,我们需要minimal reproducible example
  • @ThomasMatthews 该链接在右侧显示 TreeNode 的定义
  • @MonkeyDLuffy:抱歉,防火墙阻止我点击链接。

标签: c++ runtime-error c++14 binary-tree dsa


【解决方案1】:

在这段代码中

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-&gt;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;

【讨论】:

    【解决方案2】:
    • 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;
        }
    };
    

    【讨论】:

      【解决方案3】:

      您将“t”初始化为指向TreeNode 的指针,那么您应该在编写TreeNode *t; 之后添加t = new TreeNode;。希望这会奏效:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 2022-11-05
        • 2016-09-18
        • 2011-11-24
        • 1970-01-01
        • 2019-09-23
        • 2019-11-13
        相关资源
        最近更新 更多