day37_0617.合并二叉树

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;
            
        }
    }
};
posted @ 2022-12-16 22:48  跬步瑶  阅读(19)  评论(0)    收藏  举报