179.二叉树:合并二叉树(力扣)

作者 : admin 本文共2268个字,预计阅读时间需要6分钟 发布时间: 2024-06-16 共1人阅读

179.二叉树:合并二叉树(力扣)插图

代码解决

/**
 * 二叉树节点的定义。
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        // 若root1为空,则返回root2
        if(root1 == nullptr) return root2;
        // 若root2为空,则返回root1
        if(root2 == nullptr) return root1;

        // 创建队列以存储两棵树的节点
        queue 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);
            }

            // 若node1无左子节点但node2有,则将node2的左子节点赋给node1
            if(node1->left == nullptr && node2->left != nullptr) {
                node1->left = node2->left;
            }

            // 若node1无右子节点但node2有,则将node2的右子节点赋给node1
            if(node1->right == nullptr && node2->right != nullptr) {
                node1->right = node2->right;
            }
        } 
        // 返回合并后的树(root1)
        return root1;
    }
};
  1. 首先判断两棵树的根节点是否都为空,如果其中一棵为空,则返回另一棵。
  2. 初始化一个队列 que 用来存储两棵树的节点。
  3. 将两棵树的根节点加入队列。
  4. 当队列不为空时,进行遍历:
    • 从队列中取出两个节点,分别代表两棵树中的对应节点。
    • 将这两个节点的值相加。
    • 如果这两个节点都有左子节点,将左子节点加入队列。
    • 如果这两个节点都有右子节点,将右子节点加入队列。
    • 如果第一个节点有左子节点而第二个节点没有,将第一个节点的左子节点赋给第一个节点。
    • 如果第一个节点有右子节点而第二个节点没有,将第一个节点的右子节点赋给第一个节点。
  5. 遍历结束后,返回第一棵树的根节点。

递归 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) 
    {
        // 如果root1为空,则返回root2
        if(root1==nullptr) return root2;
        // 如果root2为空,则返回root1
        if(root2==nullptr) return root1;

        // 创建一个新节点,值为两个根节点值的和
        TreeNode* node=new TreeNode(0);
        node->val=root1->val+root2->val;

        // 递归合并左子树
        node->left=mergeTrees(root1->left,root2->left);
        // 递归合并右子树
        node->right=mergeTrees(root1->right,root2->right);

        // 返回合并后的根节点
        return node;
    }
};
  1. 首先判断两棵树的根节点是否为空,如果其中一个为空,则返回另一个。
  2. 创建一个新的树节点 node,其值为两棵原树的根节点值之和。
  3. 递归地合并两棵原树的左子树,并将合并后的节点作为新节点的左子节点。
  4. 递归地合并两棵原树的右子树,并将合并后的节点作为新节点的右子节点。
  5. 返回合并后的根节点。

这个算法的时间复杂度是 O(n),因为每个节点都会被访问一次,其中 n 是两棵树中节点数量的总和。空间复杂度也是 O(n),因为需要存储递归调用的栈。

本站无任何商业行为
个人在线分享 » 179.二叉树:合并二叉树(力扣)
E-->