https://leetcode-cn.com/problems/merge-two-binary-trees/
最简单的递归解法, 对一个节点进行合并之后,对左右子节点分别进行合并。
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(!root1)return root2;
if(!root2)return root1;
TreeNode* m=new TreeNode(root1->val+root2->val);
m->left=mergeTrees(root1->left,root2->left);
m->right=mergeTrees(root1->right,root2->right);
return m;
}
};
看了一下大佬的题解,发现这个方法存在一定的问题
对于只有一个结点为空时,方法1将整个分支直接连接到了新树上,这导致新树的某些结点是原来2棵树上的结点。一旦原树上的结点发生了变化,新树的对应结点也跟着发生变化;若原树结点被释放,则新树的对应结点也被释放了。
如果说我们选择考虑这个问题,那我们对于整个分支上的结点都要重新构造。
解决方法的代码也不难想到。我们这道题本身就是创建一个新树,树中结点的值是2棵树合并出来的。那么我们对于分支也是一个道理:创建一个新分支,分支结点的值是一颗树和一颗空树合并出来的(nullptr)。所以创建分支的代码和合并树的代码一样。只是把另一边换成了空树。
————————————————
版权声明:本文为CSDN博主「亡心灵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Wang_Xin_Ling/article/details/121494916
116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode) (leetcode-cn.com)
递归求解
class Solution {
public:
Node* connect(Node* root) {
if (root == nullptr) {
return nullptr;
}
if (root->left != nullptr) {
root->left->next = root->right;
if (root->next != nullptr) {
root->right->next = root->next->left;
}
}
connect(root->left);
connect(root->right);
return root;
}
};