[英]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.