leetcode 617. 合并二叉树 思考分析

题目

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
在这里插入图片描述

思路1:递归遍历两棵树,构造一棵新的树

1、递归参数以及返回值
返回值:新树的结点
参数:两棵旧树
2、终止条件
两棵旧树的对应的该结点都为NULL
3、逻辑(这里直接贴代码和遇到的问题)
首先将情况分为4类:
如果t1 和t2 都是空结点,那么说明新树的这个结点也是NULL
如果t1 t2中一个位空一个不为空,我们可以直接将其中不为空的一个结点的信息直接传给新结点
如果t1 t2全部存在,那么将结点值相加,传给新结点。
注意当进行递归调用traversal时:
traversal(t1->left,t2->left);:必须要保证t1、t2都不为空,否则编译器会报错。
member access within null pointer of type 'TreeNode'

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* traversal(TreeNode* t1, TreeNode* t2)
    {
        if(t1 == NULL && t2 == NULL) return NULL;
        int rootVal=0;
        if(t1 ==NULL && t2!=NULL) 
        {
            rootVal = t2->val;
            TreeNode* NewRoot = new TreeNode(rootVal);
            NewRoot->left = t2->left;
            NewRoot->right = t2->right;
            return NewRoot;
        }
        else if(t1 !=NULL && t2==NULL)
        {
            rootVal = t1->val;
            TreeNode* NewRoot = new TreeNode(rootVal);
            NewRoot->left = t1->left;
            NewRoot->right = t1->right;
            return NewRoot;
        } 
        else
        {
            rootVal = t1->val + t2->val;
            TreeNode* NewRoot = new TreeNode(rootVal);
            NewRoot->left = traversal(t1->left,t2->left);
            NewRoot->right = traversal(t1->right,t2->right);
            return NewRoot;
        } 
    }
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        return traversal(t1,t2);
    }
};

在这里插入图片描述

思路2:层序遍历两棵树,构造一棵新的树

LeetCode 101. 对称二叉树 思考分析中,有过利用队列同时遍历两棵树的经历,这里回顾了一下,然后直接上。
这里完全是基于t1来的,当不重叠的时候,直接将t2的结点直接作为t1的节点,结点与孩子的关系也被传给t1了。

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
       if(t1 == NULL && t2==NULL) return NULL;
       else if(t1 == NULL && t2!=NULL) return t2;
       else if(t1 != NULL && t2==NULL) return t1;
       queue<TreeNode*> que;
       que.push(t1);      
       que.push(t2); 
       while(!que.empty()) 
       {
            TreeNode* T1Node = que.front();
            que.pop();
            TreeNode* T2Node = que.front();
            que.pop();
            //此时两个结点一定不为空
            T1Node->val += T2Node->val;
            //如果两棵树左结点都不为空,加入队列
            if(T1Node->left && T2Node->left)
            {
                que.push(T1Node->left);
                que.push(T2Node->left);
            }
            //如果两棵树右结点都不为空,加入队列
            if(T1Node->right && T2Node->right)
            {
                que.push(T1Node->right);
                que.push(T2Node->right);
            }
            //当t1的某个结点为空时且t2的结点不为空,不入队列
            //当t1左结点为空,t2左结点不为空
            if(!T1Node->left && T2Node->left)
            {
                T1Node->left = T2Node->left;
            }
            if(!T1Node->right && T2Node->right)
            {
                T1Node->right = T2Node->right;
            }
       }    
       return  t1;
    }
};
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页