c++leetcode617/116

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;
    }
        
};

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值