算法思路

一眼递归,而且我们必须开辟新的结点。所以每次开辟的根节点的值都是两个二叉树的根节点值的和。
此题的递归三要素:

  • 递归出口:合并t1、t2的时候,当t1为空时,这个时候我们用另一个结点t2代替就行,所以返回t2。t2空同理;
  • 明确函数功能:mergeTrees(TreeNode* t1, TreeNode* t2)————>合并t1和t2,并且返回合并后的二叉树的结点;
  • 找出重复逻辑:二叉树是三部分组成的:根节点、左子树、右子树(这也是为什么关于二叉树的代码多数都采用递归的算法)。所以合并的时候依次合并三部分就行。合并左右子树和合并根节点的逻辑是一样的

代码实现

class Solution {
public:
    /**
     * 
     * @param t1 TreeNode类 
     * @param t2 TreeNode类 
     * @return TreeNode类
     */
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if(!t1) return t2;
        if(!t2) return t1;
        TreeNode *newRoot = new TreeNode(t1->val+t2->val);
        newRoot->left = mergeTrees(t1->left,t2->left);
        newRoot->right = mergeTrees(t1->right,t2->right);
        return newRoot;
    }
};