首页 > 其他分享 >day37_0617.合并二叉树

day37_0617.合并二叉树

时间:2022-12-16 22:55:51浏览次数:48  
标签:right TreeNode day37 t1 二叉树 0617 left root1 root2

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

标签:right,TreeNode,day37,t1,二叉树,0617,left,root1,root2
From: https://www.cnblogs.com/deservee/p/16988454.html

相关文章

  • LEETCODE 222. 完全二叉树的节点个数
    递归递归很简单,遍历整棵树即可,代码复杂度为O(n)点击查看代码funccountNodes(root*TreeNode)int{ifroot==nil{return0}return1+coun......
  • 二叉树的遍历
    1.二叉树的遍历二叉树主要有两种遍历方式:深度优先遍历:先往深走,遇到叶子节点再往回走。前序遍历(递归法,迭代法)中左右中序遍历(递归法,迭代法) 左中右后序遍历(递归法,迭代......
  • 二叉树前中后序递归遍历完整代码【超简单易懂】
    //二叉树的前中后序遍历【递归法】#include<iostream>usingnamespacestd;//结点结构体typedefstructBTnode{ chardata;//自己的数据 BTnode*lch......
  • 104. 二叉树的最大深度
    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树[3,9,20,null,null......
  • 对称的二叉树
    请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。/***Definitionforabinarytreenode.*structTreeNode{*......
  • 二叉树的镜像
    输入一个二叉树,将它变换为它的镜像。 /***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*r......
  • 剑指Offer-Java-二叉树的镜像
    题目题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树8/\610/\/\57911......
  • 剑指Offer-Java-重建二叉树
    题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍......
  • 剑指Offer-Java-序列化二叉树
    题目请实现两个函数,分别用来序列化和反序列化二叉树代码此题的核心点是如何表示二叉树,并且解释。/*publicclassTreeNode{intval=0;TreeNodeleft=null;......
  • 94. 二叉树的中序遍历
    给定一个二叉树的根节点root,返回它的中序遍历。示例1:输入:root=[1,null,2,3]输出:[1,3,2]点击查看代码definorderTraversal(self,root):res......