今日算法:617,合并二叉树

cpp 复制代码
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
         // 终止条件:一个为空,直接返回另一个
        if(root1 == nullptr) return root2;
        if(root2 == nullptr) return root1;

        // 当前节点值相加
        TreeNode* node = new TreeNode(root1->val + root2->val);
        // 递归构建左右子树,挂载到当前节点
        node->left = mergeTrees(root1->left, root2->left);
        node->right = mergeTrees(root1->right, root2->right);
        return node;
    }
};

进行递归注意左右子树的存在;

cpp 复制代码
class Solution {
public:

    TreeNode*addtree(TreeNode*node1,TreeNode*node2)
    {
        if(node1==nullptr&&node2==nullptr)
        return node1;//终止条件

        TreeNode*node=new TreeNode(0);
        if(node1&&node2)
        {
            node->val=node1->val+node2->val;
           
        }
        else if(node1&&node2==nullptr)
        {
            node->val=node1->val;
           
        }
        else if(node1==nullptr&&node2)
        {
            node->val=node2->val;
            
        }

        //遍历左右子树

        //左
        // if(node1->left||node2->left)
        // node->left=addtree(node1->left,node2->left);

        // if(node1->right||node2->right)
        // node->right=addtree(node->right,node2->right);

        if(node1 != nullptr && node2 != nullptr)
            node->left = addtree(node1->left, node2->left);
        else if(node1 != nullptr)
            node->left = addtree(node1->left, nullptr);
        else if(node2 != nullptr)
            node->left = addtree(nullptr, node2->left);

        // 右子树
        if(node1 != nullptr && node2 != nullptr)
            node->right = addtree(node1->right, node2->right);
        else if(node1 != nullptr)
            node->right = addtree(node1->right, nullptr);
        else if(node2 != nullptr)
            node->right = addtree(nullptr, node2->right);

return node;
        
    }

    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        //前序遍历进行
        return addtree(root1,root2);
    }
};

理解递归的用法;

下面是非递归

cpp 复制代码
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        //层序遍历
        //迭代法

        if(root1==nullptr) return root2;
        if(root2==nullptr) return root1;

        queue<TreeNode*> que;
        que.push(root1);
        que.push(root2);
        while(!que.empty())
        {
            TreeNode*node1=que.front(); que.pop();
            TreeNode*node2=que.front(); que.pop();
            node1->val+=node2->val;

            if(node1->left!=nullptr&&node2->left!=nullptr)
            {
               que.push(node1->left);
                que.push(node2->left);
            }

            if(node1->right!=nullptr&&node2->right!=nullptr)
            {
               que.push(node1->right);
                que.push(node2->right);
            }

            //特殊情况
            if(node1->left==nullptr&&node2->left)
            node1->left=node2->left;

            if(node1->right==nullptr&&node2->right)
            node1->right=node2->right;
//因为本身返回的就是node1,所以不用对node1左右存在node2不存在做处理
        }
        return root1;
    }
};

使用一个队列而已

下面是使用3个队列进行解题

cpp 复制代码
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if (t1 == nullptr) {
            return t2;
        }
        if (t2 == nullptr) {
            return t1;
        }
        auto merged = new TreeNode(t1->val + t2->val);
        auto q = queue<TreeNode*>();
        auto queue1 = queue<TreeNode*>();
        auto queue2 = queue<TreeNode*>();
        q.push(merged);
        queue1.push(t1);
        queue2.push(t2);
        while (!queue1.empty() && !queue2.empty()) {
            auto node = q.front(), node1 = queue1.front(), node2 = queue2.front();
            q.pop();
            queue1.pop();
            queue2.pop();
            auto left1 = node1->left, left2 = node2->left, right1 = node1->right, right2 = node2->right;
            if (left1 != nullptr || left2 != nullptr) {
                if (left1 != nullptr && left2 != nullptr) {
                    auto left = new TreeNode(left1->val + left2->val);
                    node->left = left;
                    q.push(left);
                    queue1.push(left1);
                    queue2.push(left2);
                } else if (left1 != nullptr) {
                    node->left = left1;
                } else if (left2 != nullptr) {
                    node->left = left2;
                }
            }
            if (right1 != nullptr || right2 != nullptr) {
                if (right1 != nullptr && right2 != nullptr) {
                    auto right = new TreeNode(right1->val + right2->val);
                    node->right = right;
                    q.push(right);
                    queue1.push(right1);
                    queue2.push(right2);
                } else if (right1 != nullptr) {
                    node->right = right1;
                } else {
                    node->right = right2;
                }
            }
        }
        return merged;
    }
};

把两颗树进行放到两个队列中,进行相加到第三个队列,对左右子树进行处理,和我解释的递归解释那个写法很像;

相关推荐
科研online19 分钟前
基于多源数据和XGBoost-SHAP分析中国大陆绿地碳汇空间变异影响因素的非线性相关性与尺度差异
算法·学习方法
Cthy_hy38 分钟前
拓扑排序超详解:原理 + Kahn 贪心算法
python·算法·贪心算法
三品吉他手会点灯1 小时前
C语言学习笔记 - 43.运算符与表达式 - 运算符1 - 运算符的分类和简单介绍
c语言·笔记·学习·算法
VkN2X2X4b1 小时前
算法复杂度的实验验证与误差分析的技术8
算法
其利天下技术1 小时前
风扇灯无刷电机自适应算法实战指南
算法·cocos2d·无刷电机自适应算法·bldc驱动自适应算法·其利无刷电机驱动算法
8Qi82 小时前
LeetCode 494:目标和(Target Sum)—— 题解 ✅
算法·leetcode·职场和发展·动态规划·01背包
hujinyuan201602 小时前
2026年3月 中国电子学会青少年软件编程(Python)三级考试试卷 真题及答案
java·python·算法
froyoisle2 小时前
CSP-J 历年复赛 T1 及解析(2019~2025)
数据结构·c++·算法·csp-j·csp·算法竞赛·信息学
珊瑚里的鱼3 小时前
【动态规划】打家劫舍Ⅱ
算法·动态规划
chao1898443 小时前
SGM(Semi-Global Matching)立体匹配算法 — C++ 实现
开发语言·c++·算法