【树】-Lc617-合并二叉树(同时递归2棵树)

本文介绍了如何在Java中实现合并两个二叉树的算法,通过递归方式处理节点值相加的问题,并提供了具体的代码示例。
摘要由CSDN通过智能技术生成

写在前面

  最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。



一、场景描述

  合并二叉树。将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是,如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例 1:
输入:
	Tree 1                     Tree 2
          1                         2
         / \                       / \
        3   2                     1   3
       /                           \   \
      5                             4   7

输出:
合并后的树:
	     3
	    / \
	   4   5
	  / \   \
	 5   4   7

二、具体步骤

1.环境说明

名称说明
IntelliJ IDEA2019.2

2.代码

以下为Java版本实现:

public class Lc617_MergeTrees {

    public static void main(String[] args) {
        // t1
        TreeNode t1n5 = new TreeNode(5);
        TreeNode t1n2 = new TreeNode(2);
        TreeNode t1n3 = new TreeNode(3);
        t1n3.left = t1n5;
        TreeNode t1 = new TreeNode(1);
        t1.left = t1n3;
        t1.right = t1n2;

        // t2
        TreeNode t2n7 = new TreeNode(7);
        TreeNode t2n3 = new TreeNode(3);
        t2n3.right = t2n7;
        TreeNode t2n4 = new TreeNode(4);
        TreeNode t2n1 = new TreeNode(1);
        t2n1.right = t2n4;
        TreeNode t2 = new TreeNode(2);
        t2.left = t2n1;
        t2.right = t2n3;

        System.out.println(Helper.levelOrder(mergeTrees(t1, t2)));
    }


    /**
     * 思路:
     * 返回值是TreeNode
     * 合并2个二叉树, 将t2覆盖到t1上,直接返回t1
     *
     * 递归 2 棵树,处理2个结点
     * 结束条件:至少一个为空,则用另一个结点来返回(覆盖),即 if t1 == null return t2, if t2 == null return t1
     *
     * 否则2个节点都不为空,直接累加 t1.val += t2.val
     *
     * 分别递归处理左子树和右子树
     *      t1.left  = (t1.left, t2.left)
     *      t1.right = (t1.right, t2.right)
     *
     * @param t1
     * @param t2
     * @return
     */
    private static TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        // 为空覆盖操作
        if (t1 == null) {
            return t2;
        }

        if (t2 == null) {
            return t1;
        }

        t1.val += t2.val;

        // 递归处理左右子树
        t1.left = mergeTrees(t1.left, t2.left);
        t1.right = mergeTrees(t1.right, t2.right);

        return t1;
    }


    static class Helper {

        private static List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> result = new ArrayList<>();
            if (root == null) {
                return result;
            }

            // LinkedList也是一个队列
            Queue<TreeNode> queue = new LinkedList<>();
            queue.offer(root);

            while (!queue.isEmpty()) {
                // size控制一层结点的个数
                int size = queue.size();
                List<Integer> list = new ArrayList<>();
                while (size-- > 0) {
                    TreeNode node = queue.poll();
                    list.add(node.val);

                    if (node.left != null) {
                        queue.offer(node.left);
                    }

                    if (node.right != null) {
                        queue.offer(node.right);
                    }
                }
                result.add(list);
            }

            return result;
        }
    }

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode(int val) {
            this.val = val;
        }
    }
}


写在后面

  如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值