617. Merge Two Binary Trees(C++ 和 Java)

这篇博客由华中科技大学的自然语言处理研究生撰写,介绍如何用C++和Java解决LeetCode上的热门问题617——合并两颗二叉树。博主通过递归法详细解析了解题思路,强调二叉树问题通常涉及先序、中序、后序、层序遍历,并提供了具体的解题代码。文章最后还探讨了简化解题方法的可能性。
摘要由CSDN通过智能技术生成

本小白华中科技大学在读研究生,自然语言处理方向。现每日一更LeetCode  Top 100 Liked Questions, 旨在于通过通俗易懂的画风和诸位计算机朋友们一起成长呀,不局限某题,争取举一反三,所有Questions均呈上C++和Java解法,不足之处多多指正,共同学习。

关于二叉树,再难也不过与先序、中序、后序、层序遍历,大多是递归法(回溯法),只有层序遍历不是(运用了队列)。

解题思路:

合并两颗二叉树———>操作某节点后,需要再合并其左子树和右子树———>果断递归法。

若t1和t2均为空,则递归结束,作为递归结束条件;

若t1为空,t2不为空,创建值为t2的节点,再递归t2的左右孩子;

若t1不为空,t2为空,创建值为t1的节点,再递归t1的左右孩子;

若均不为空,创建值为t1 + t2的节点,递归要考虑两者的左右孩子;

注释代码举了Example中的例子

/**
 * 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* t1, TreeNode* t2) {
        //如Tree 1的节点2和Tree 2节点3的左孩子均是NULL,作为递归结束条件
        if(t1 == NULL && t2 == NULL){
            return NULL;
        }
        
        TreeNode* node = (TreeNode*) malloc(sizeof(struct TreeNode));
        if(t1 == NULL){            //如Tree 1的节点3无右孩子,但Tree 2节点1有
            node->val = t2->val; 
            node->left = mergeTrees(NULL, t2->left);        //递归t2的左子树
            node->right = mergeTrees(NULL, t2->right);      //递归t2的右子树
        }
        else if(t2 == NULL){        //如Tree 1的节点3有左孩子,但Tree 2节点1没有
            node->val = t1->val; 
            node->left = mergeTrees(t1->left, NULL);
            node->right = mergeTrees(t1->right, NULL);
        }
        else{                       //如两颗二叉树的头结点1和2
            node->val = t1->val + t2->val;        
            node->left = mergeTrees(t1->left, t2->left);    //同时递归t1和t2的左子树 
            node->right = mergeTrees(t1->right, t2->right); //同时递归t1和t2的右子树
        }
        
        return node;            //返回节点
    }
};

能不能再简单点?

 TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if(!t1){        //此时不管t2是不是空,都符合要求,若t2非空,返回t2并且传递了其左右子树
            return t2;
        }
        if(!t2){
            return t1;
        }
        return new TreeNode(t1->val + t2->val, mergeTrees(t1->left, t2->left), mergeTrees(t1->right, t2->right));            //返回节点
    }

java版本

public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        if(t1 == null){    
            return t2;
        }
        if(t2 == null){
            return t1;
        }
        return new TreeNode(t1.val + t2.val, mergeTrees(t1.left, t2.left), mergeTrees(t1.right, t2.right));                   
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值