0617.合并二叉树
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
int val1 = 0, val2 = 0;
if (root1 != NULL)
val1 = root1->val;
if (root2 != NULL)
val2 = root2->val;
TreeNode* sroot = new TreeNode(val1 + val2);
if (root1->left || root2->left)
sroot->left = mergeTrees(root1->left, root2->left);
if (root1->right || root2->right)
sroot->right = mergeTrees(root1->right, root2->right);
return sroot;
}
};
- 定义了val1 val2初值为0 确实是有考虑到对应是空指针的数值 但是本质上并没有对空指针的情况做处理
- 如果觉得上面那句话有亿点点绕 可以反着来思考------如果我的root1或者root2为空的话 那么套入写好的代码 ------
- 当root1为空 则val1取值为0 否则取值root1->val -----------该语句避免了对root==nulptr时进行操作
- 当root2为空 同上
- 往下继续
- 当root1为空 怎么能root1->left进行操作呢?
- 当root2为空 同上
- 因此重点来了
- 要想进行root1->left root2->left操作 那么必须root != nullptr 也就是说 rootNULL的情况已经在之前return了解出了结果了 **rootNULL的情况发生并且经过了解后就不会再执行之后的语句了** 而我的答案虽然考虑到为空时对应变量赋值为0 但是在此之后 一没return了解结果(非必要) 二在此之后不能再有操作
- 简而言之 对指针进行操作时 要防止该指针是空指针 因为对空指针操作会报错!!!!
- 下面是我的改正--ac
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if (root1 == NULL) return root2;
if (root2 == NULL) return root1;
TreeNode* sroot = new TreeNode(root1->val + root2->val);
if (root1->left || root2->left)
sroot->left = mergeTrees(root1->left, root2->left);
if (root1->right || root2->right)
sroot->right = mergeTrees(root1->right, root2->right);
return sroot;
}
};
- 卡哥代码1----新建树 跟我思路一致-----但是没有两个if判断
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (t1 == NULL) return t2;
if (t2 == NULL) return t1;
// 重新定义新的节点,不修改原有两个树的结构
TreeNode* root = new TreeNode(0);
root->val = t1->val + t2->val;
root->left = mergeTrees(t1->left, t2->left);
root->right = mergeTrees(t1->right, t2->right);
return root;
}
};
- 卡哥思路2----重复利用其中一个树 不需要新建
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
// 修改了t1的数值和结构
t1->val += t2->val; // 中
t1->left = mergeTrees(t1->left, t2->left); // 左
t1->right = mergeTrees(t1->right, t2->right); // 右
return t1;
}
};
- 迭代法 自己写不下去了--以后看
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if (root1 == NULL) return root2;
if (root2 == NULL) return root1;
vector <int> val;
queue <TreeNode*> que1;
queue <TreeNode*> que2;
if (root1 != NULL) que1.push(root1);
if (root2 != NULL) que2.push(root2);
while (!que1.empty() || !que2.empty()) {
int size1 = que1.size();
for (int i = 0; i < size1; i++) {
TreeNode* node1 = que1.top();
TreeNode* node2 = que2.top();
val.push_backk(node1->val + node2->val);
if (node1->left == NULL) {
TreeNode* node = new TreeNode(0);
que1.push(node);
}
else {
que1.push(node1->left);
}
if (node1->right == NULL) {
TreeNode* node = new TreeNode(0);
que1.push(node);
}
else {
que1.push(node1->right);
}
if (node2->left == NULL) {
TreeNode* node = new TreeNode(0);
que2.push(node);
}
else {
que2.push(node2->left);
}
if (node2->right == NULL) {
TreeNode* node = new TreeNode(0);
que2.push(node);
}
else {
que2.push(node2->right);
}
}
}
TreeNode* sroot = new TreeNode(val[0]);
for (int i = 1; i < val.size(); i++) {
if (val[i] == 0 && (i / 2) == 0)
sroot->right == NULL;
if (val[i] == 0 && (i / 2) != 0)
sroot->left == NULL;
}
}
};
标签:right,TreeNode,day37,t1,二叉树,0617,left,root1,root2
From: https://www.cnblogs.com/deservee/p/16988454.html