【题解】合并二叉树

合并二叉树

题目链接:合并二叉树

解题思路1:递归+前序遍历

首先说一下为什么推荐用前序遍历,前序遍历是根左右的顺序,我们创建树,很好的方式是最先创建树根,再把左右节点往树上挂

其次为什么用递归呢?对于二叉树而言,每一个左右子树都可以看作是一棵完整的树,整体是树,部分也是树,很容易想要用递归的方式解决问题

我们同时遍历两棵二叉树,如果各自节点不为空,就将值相加,如果1树节点为空,就返回2树节点,如果2树节点为空,就返回1树节点,如果节点都为空,那就返回空节点了

代码如下:

    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if(t1 == nullptr) return t2;
        if(t2 == nullptr) return t1;
        //前序遍历
        //创建根节点
        TreeNode* head = new TreeNode(t1->val+t2->val);
        //进入左子树
        head->left = mergeTrees(t1->left, t2->left);
        //进入右子树
        head->right = mergeTrees(t1->right, t2->right);
        return head;
    }

解题思路2:队列+层次遍历

我们创建三个队列,q,q1,q2,分别保存合并后的节点,以及两棵被合并树的节点,采用队列实现层次遍历,来创建新树

代码如下:

    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if(t1 == nullptr) return t2;
        if(t2 == nullptr) return t1;
        queue<TreeNode*> q;//保存合并后的节点
        queue<TreeNode*> q1;
        queue<TreeNode*> q2;
        //合并根节点
        TreeNode* head = new TreeNode(t1->val+t2->val);
        q.push(head);
        q1.push(t1);
        q2.push(t2);
        while(!q1.empty() && !q2.empty()){
            TreeNode* node = q.front();
            TreeNode* node1 = q1.front();
            TreeNode* node2 = q2.front();
            q.pop();
            q1.pop();
            q2.pop();
            TreeNode* left1 = node1->left, *left2 = node2->left;
            TreeNode* right1 = node1->right, *right2 = node2->right;
            if(left1!=nullptr || left2!=nullptr){
                if(left1!=nullptr && left2!=nullptr){
                    TreeNode* left = new TreeNode(left1->val + left2->val);
                    node->left = left;
                    //新节点入队列
                    q.push(left);
                    q1.push(left1);
                    q2.push(left2);
                }else if(left1!=nullptr){
                    node->left = left1;
                }else if(left2!=nullptr){
                    node->left = left2;
                }
            }
            if(right1!=nullptr || right2!=nullptr){
                if(right1!=nullptr && right2!=nullptr){
                    TreeNode* right = new TreeNode(right1->val+right2->val);
                    node->right = right;
                    q.push(right);
                    q1.push(right1);
                    q2.push(right2);
                }else if(right1!=nullptr){
                    node->right = right1;
                }else {
                    node->right = right2;
                }
            }
        }
        return head;
    }

你可能感兴趣的:(题目练习,算法)