二叉树的覆盖&二叉树的合并

package ACM_Exercise;

import java.util.*;

/**
 * @author Halu
 * @create 2022-09-30 20:04
 */
public class HuaTest3 {
    public static class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val){
            this.val=val;
        }
    }

    public static ArrayList<Integer> res = new ArrayList<>();
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s1 = in.nextLine();
        String[] str1 = s1.substring(1,s1.length()-1).split(",");
        String s2 = in.nextLine();
        String[] str2 = s2.substring(1,s2.length()).split("/");
        String s3 = in.nextLine();
        String[] str3 = s3.substring(1,s3.length()-1).split(",");

//        // 字符串数组转为数组
        int[] num1 = new int[str1.length];
        int[] num2 = new int[str2.length];
        int[] num3 = new int[str3.length];

        for (int i = 0; i < str1.length; i++) {
            num1[i] = Integer.parseInt(str1[i]);
        }
        for (int i = 0; i < str2.length; i++) {
            num2[i] = Integer.parseInt(str2[i]);
        }
        for (int i = 0; i < str3.length; i++) {
            num3[i] = Integer.parseInt(str3[i]);
        }

        // 建立二叉树
        TreeNode tree1 = BuildTree(num1,0);
        TreeNode tree2 = BuildTree(num3,0);
        // 进行子树替换
//        if (num2.length>1){
            replaceTree(tree1,tree2,num2,1);
//        }else{
//            tree1 = tree2;
//        }

        // 遍历输出
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(tree1);

        while (!queue.isEmpty()){
//            List<Integer> levelRes = new ArrayList<Integer>();//存当前层的节点
            int size=queue.size();//计算队列的size
            while (size>0){
                TreeNode cur = queue.poll();
                size--;
                res.add(cur.val);
                if (cur.left!=null) queue.add(cur.left);
                if (cur.right!=null) queue.add(cur.right);
            }
//            res.add(levelRes);
        }
        String outStr = "[";
        int index = 0;
        for(int num:res){

                if (num==0){
                    outStr += num1[index];
                }else {
                    outStr += num;
                }
            if (index<num1.length-1){
                outStr+=",";
            }else{
                outStr+="]";
            }
            index++;
        }

        System.out.println(outStr);
//


    }

    private static void replaceTree(TreeNode root1, TreeNode root2, int[] path, int i) {
        if (i==path.length-1){
            if (root1.left!=null && root1.left.val==path[i]){
                replaceHelp(root1.left,root2);
                return;
            }else if (root1.right!=null && root1.right.val==path[i]){
                replaceHelp(root1.right,root2);
                return;
            }
        }

        if (root1.left!=null && root1.left.val==path[i]){
            replaceTree(root1.left,root2,path,i+1);
        }else if(root1.right!=null && root1.right.val==path[i]){
            replaceTree(root1.right,root2,path,i+1);
        }
    }

    public static void replaceHelp(TreeNode root1, TreeNode root2){
        if (root1==null && root2==null){
            return;
        }

        if(root1!=null && root2!=null) {
            root1.val = root2.val;
            replaceHelp(root1.left, root2.left);
            replaceHelp(root1.right, root2.right);
        }
        if (root1==null && root2!=null){
            root1=root2;
        }

        return;
    }

    public static TreeNode BuildTree(int[] nums, int index){
        TreeNode newNode = null;
        if(index<nums.length){
            newNode = new TreeNode(nums[index]);
            newNode.left = BuildTree(nums,2*index+1);
            newNode.right = BuildTree(nums,2*index+2);
        }
        return newNode;
    }

}
package ACM_Exercise;

import java.util.*;

/**
 * @author Halu
 * @create 2022-09-30 20:04
 */
public class HuaTest3 {
    public static class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val){
            this.val=val;
        }
    }

    public static ArrayList<Integer> res = new ArrayList<>();
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s1 = in.nextLine();
        String[] str1 = s1.substring(1,s1.length()-1).split(",");
        String s2 = in.nextLine();
        String[] str2 = s2.substring(1,s2.length()).split("/");
        String s3 = in.nextLine();
        String[] str3 = s3.substring(1,s3.length()-1).split(",");

//        // 字符串数组转为数组
        int[] num1 = new int[str1.length];
        int[] num2 = new int[str2.length];
        int[] num3 = new int[str3.length];

        for (int i = 0; i < str1.length; i++) {
            num1[i] = Integer.parseInt(str1[i]);
        }
        for (int i = 0; i < str2.length; i++) {
            num2[i] = Integer.parseInt(str2[i]);
        }
        for (int i = 0; i < str3.length; i++) {
            num3[i] = Integer.parseInt(str3[i]);
        }

        // 建立二叉树
        TreeNode tree1 = BuildTree(num1,0);
        TreeNode tree2 = BuildTree(num3,0);
        // 进行子树替换
//        if (num2.length>1){
            replaceTree(tree1,tree2,num2,1);
//        }else{
//            tree1 = tree2;
//        }

        // 遍历输出
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(tree1);

        while (!queue.isEmpty()){
//            List<Integer> levelRes = new ArrayList<Integer>();//存当前层的节点
            int size=queue.size();//计算队列的size
            while (size>0){
                TreeNode cur = queue.poll();
                size--;
                res.add(cur.val);
                if (cur.left!=null) queue.add(cur.left);
                if (cur.right!=null) queue.add(cur.right);
            }
//            res.add(levelRes);
        }
        String outStr = "[";
        int index = 0;
        for(int num:res){

                if (num==0){
                    outStr += num1[index];
                }else {
                    outStr += num;
                }
            if (index<num1.length-1){
                outStr+=",";
            }else{
                outStr+="]";
            }
            index++;
        }

        System.out.println(outStr);
//


    }

    private static void replaceTree(TreeNode root1, TreeNode root2, int[] path, int i) {
        if (i==path.length-1){
            if (root1.left!=null && root1.left.val==path[i]){
                replaceHelp(root1.left,root2);
                return;
            }else if (root1.right!=null && root1.right.val==path[i]){
                replaceHelp(root1.right,root2);
                return;
            }
        }

        if (root1.left!=null && root1.left.val==path[i]){
            replaceTree(root1.left,root2,path,i+1);
        }else if(root1.right!=null && root1.right.val==path[i]){
            replaceTree(root1.right,root2,path,i+1);
        }
    }

    public static void replaceHelp(TreeNode root1, TreeNode root2){
        if (root1==null && root2==null){
            root1 = null;
            return ;
        }
        if (root1==null && root2!=null){
            root1=root2;
            return;
        }
        if(root1!=null && root2==null){
            return;
        }
//        if(root1!=null && root2!=null) {
            root1.val = root2.val;
            replaceHelp(root1.left, root2.left);
            replaceHelp(root1.right, root2.right);
//        }
        return;
    }

    public static TreeNode BuildTree(int[] nums, int index){
        TreeNode newNode = null;
        if(index<nums.length){
            newNode = new TreeNode(nums[index]);
            newNode.left = BuildTree(nums,2*index+1);
            newNode.right = BuildTree(nums,2*index+2);
        }
        return newNode;
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值