LeetCode刷题之HOT100之合并二叉树

2024/5/26 晴。是的,等下我要去长乐沙滩赶海哈哈,因为这几天数字峰会,地铁公交又免费啦。ok,今天做的是HOT100里面最后一道easy题目啦,明天就是要跨越一个难度啦!做题吧

1、题目描述

在这里插入图片描述

2、逻辑分析

题目要求:给定两个二叉树,要求合并它们。合并的规则就是:类似于将它们叠起来,重合部分相加,未重合部分就为数值不为空的数据加入。那么,怎么做呢?我的思路是:以深度或广度优先搜索来遍历这两棵树A和B,遍历顺序同步,如果相同节点都有数据,那么相加后给到A树上,如果只有一个树节点有数据,也是给到A树对应的节点上,最后返回A树即可。看了题解,官方也是给出了这两种方法。官方给出的步骤分析非常清晰,我直接放这里:LeetCode题解

3、代码演示

```java
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        // 如果 root1 为 null,直接返回 root2
        if( root1 == null){
            return root2;
        }
        // 如果 root2 为 null,直接返回 root1
        if(root2 == null){
            return root1;
        }
        // 创建一个新的节点 merged,值为 root1 和 root2 对应节点值之和
        TreeNode merged = new TreeNode(root1.val + root2.val);
        // 递归合并左子树
        merged.left = mergeTrees(root1.left, root2.left);
        // 递归合并右子树
        merged.right = mergeTrees(root1.right, root2.right);
         // 返回合并后的新二叉树的根节点
        return merged;
    }

时间复杂度:O(min(m,n)),空间复杂度:O(min(m,n))。

深度优先搜索里面是递归的思想,之前也做过几道类似的题目,所以理解起来很顺畅,接下来看看广度优先搜索的具体实现吧。实现思路:使用三个队列,两个用来存放两个二叉树遍历的值,另一个用来存储新二叉树的值。直接上代码:

public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(root1 == null){
            return root2;
        }
        if(root2 == null){
            return root1;
        }
        // 创建一个新的节点 merged,值为 root1 和 root2 对应节点值之和
        TreeNode merged = new TreeNode(root1.val + root2.val);
        // 创建三个队列:一个用于存储合并后的节点,一个用于存储 root1 的节点,一个用于存储 root2 的节点
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        Queue<TreeNode> queue1 = new LinkedList<TreeNode>();
        Queue<TreeNode> queue2 = new LinkedList<TreeNode>();
        // 将 merged 节点添加到 queue 队列中
        queue.offer(merged);
        // 将 root1 和 root2 分别添加到 queue1 和 queue2 队列中
        queue1.offer(root1);
        queue2.offer(root2);
        // 当 queue1 和 queue2 都不为空时,进行循环处理
        while(!queue1.isEmpty() && !queue2.isEmpty()){
            // 从 queue、queue1 和 queue2 中分别取出一个节点
            TreeNode node = queue.poll(), node1 = queue1.poll(), node2 = queue2.poll();
            // 获取 node1 和 node2 的左右子节点
            TreeNode left1 = node1.left, left2 = node2.left, right1 = node1.right, right2 = node2.right;
            // 处理左子节点的合并
            if(left1 != null || left2 != null){
                if(left1 != null && left2 != null){
                    // 创建一个新的左子节点,值为 left1 和 left2 的值之和
                    TreeNode left = new TreeNode(left1.val + left2.val);
                    node.left = left;
                    queue.offer(left);
                    queue1.offer(left1);
                    queue2.offer(left2);
                // 如果 left1 不为 null,则直接将其赋给 node 的左子节点
                }else if(left1 != null){
                    node.left = left1;
                // 如果 left2 不为 null,则直接将其赋给 node 的左子节点
                }else if(left2 != null){
                    node.left = left2;
                }
            }
             // 处理右子节点的合并,逻辑与左子节点合并类似
            if(right1 != null || right2 != null){
                if(right1 != null && right2 != null){
                    TreeNode right = new TreeNode(right1.val + right2.val);
                    node.right = right;
                    queue.offer(right);
                    queue1.offer(right1);
                    queue2.offer(right2);
                }else if(right1 != null){
                    node.right = right1;
                }else if(right2 != null){
                    node.right = right2;
                }
            }
        }
        // 返回合并后的新二叉树的根节点
        return merged;
    }

代码比较冗长,但是理解起来还是很方便了,逻辑更为清晰了。时间复杂度:O(min(m,n)),空间复杂度:O(min(m,n))。

ok啦,HOT100的Easy部分也就告一段落啦,接下来就是中等和困难啦!准备去赶海啦,这对一个中部地区生长的孩子是有莫大的吸引力的,BYE!

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值