617.合并二叉树

本文详细介绍了如何使用迭代法和递归法合并两棵二叉树,通过层序遍历和递归调用来实现节点值的累加与结构的合并。在迭代法中,利用队列处理重叠节点,而在递归法中,通过逐层合并节点并更新值。这两种方法均能有效合并具有重叠部分的二叉树结构。
摘要由CSDN通过智能技术生成

解题思路

  1. 迭代法
    只在一棵树上做改变:如果是重叠结点(即都有左孩子或者右孩子):用一个队列装入两棵树的重叠结点,两值相加,更新1树的结点值。如果不重叠,则将第二棵树有而第一棵树没有的结点连接到第一棵树上。利用层序遍历,分情况要讨论:(1)12树有左孩子;(2)12树有右孩子;(3)1树没有左孩子,2树有;(4)1树没有右孩子,2树有
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(!root1)return root2;
        if(!root2)return root1;
        queue<TreeNode*>que;//用来装载两棵树都有的相同结点
        que.push(root1);
        que.push(root2);
        //层序遍历,在root1本身做改变:相同结点就叠加,没有左就补左,没有右就补右
        while(!que.empty() ){
            TreeNode* node1=que.front();
            que.pop();
            TreeNode* node2=que.front();
            que.pop();
            node1->val+=node2->val;
            
            if(node1->left && node2->left){
                que.push(node1->left);
                que.push(node2->left);
            }

            if(node1->right && node2->right){
                que.push(node1->right);
                que.push(node2->right);
            }

            if(!node1->left && node2->left){
                node1->left=node2->left;
            }

            if(!node1->right && node2->right){
                node1->right=node2->right;
            }
        }
        return root1;
    }
};
  1. 递归法
    (1)确定 递归终止条件:遍历两棵树的结点,如果1树的结点为空,那就将2树的对应结点补上(2树为空也无所谓,补上还是空的) 同理2树的结点为空,就保持1树的结点,返回1树结点即可
    (2)确定 单层递归逻辑:如果是重叠点,就将2树的结点值加到1树对应结点上。然后再对1树的左孩子2树的左孩子进行合并递归,对1树的右孩子2树的右孩子进行合并递归
    (3)返回值:返回1树根结点
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        //用递归来做
        if(!root1)return root2;
        if(!root2)return root1;
        root1->val+=root2->val;
        root1->left=mergeTrees(root1->left,root2->left);
        root1->right=mergeTrees(root1->right,root2->right);
        return root1;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值