簡體   English   中英

合並 2 個二叉樹時出現運行時錯誤

[英]runtime error while merging 2 binary trees

我正在嘗試從 leetcode 解決合並二叉樹問題。 這是我的 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的指針,然后您應該添加t = new TreeNode; 在你寫TreeNode *t; . 希望這會奏效:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM