目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 1、输入
- 2、输出
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2024C卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
将一棵二叉树按照路径替换到另一棵二叉树中,得到一棵新的二叉树。替换动作满足如下条件:
- 子树的根节点完全替换根二叉树对应的节点
- 子树根节点下的子树完全保留
- 根二叉树的对应节点下的子树完全删除
二、输入描述
输入为三行
第一行:一个数组,表示根二叉树。二叉树的每个节点在1到9之间,包含1和9,空节点用0表示。
第二行:一个字符串,表示子二叉树根节点对应根二叉树的节点。如“/1/2”对应(每个节点不存在相同的子节点,即path对应的子树最多只有一个)。
第三行:一个数组表示子二叉树。二叉树的每个节点在1到9之间,包含1和9,空节点用0表示。
三、输出描述
一个数组,表示一个二叉树,逐层从左到右描述,为空的节点忽略(与输入不同)。
1、输入
[1,1,2,0,0,4,5]
/1/2
[5,3,0]
2、输出
[1,1,5,3]
四、解题思路
- 将每行的输入放入根二叉树数组arr1、子二叉树根节点对应根二叉树的节点数组arr2、子二叉树数组arr3;
- 根二叉树建树、子二叉树建树;
- 子二叉树根节点对应根二叉树的节点,进行子树替换;
- 如果子二叉树根节点对应根二叉树的节点只有1个,则完全替换,否则通过回溯替换子树;
- 遍历输出结果。
五、Java算法源码
public class Test02 {/*** [1,1,2,0,0,4,5]* /1/2* [5,3,0]*/public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 根二叉树String input1 = sc.nextLine();String[] inputArr1 = input1.substring(1, input1.length() - 1).split(",");// 根二叉树数组int[] arr1 = new int[inputArr1.length];for (int i = 0; i < inputArr1.length; i++) {arr1[i] = Integer.parseInt(inputArr1[i]);}// 子二叉树根节点对应根二叉树的节点 /1/2String input2 = sc.nextLine();String[] inputArr2 = input2.substring(1, input2.length()).split("/");int[] arr2 = new int[inputArr2.length];for (int i = 0; i < inputArr2.length; i++) {arr2[i] = Integer.parseInt(inputArr2[i]);}// 子二叉树String input3 = sc.nextLine();String[] inputArr3 = input3.substring(1, input3.length() - 1).split(",");// 子二叉树数组int[] arr3 = new int[inputArr3.length];for (int i = 0; i < inputArr3.length; i++) {arr3[i] = Integer.parseInt(inputArr3[i]);}// 根二叉树建树TreeNode treeNode1 = buildTree(arr1, 0);// 子二叉树建树TreeNode treeNode3 = buildTree(arr3, 0);// 子二叉树根节点对应根二叉树的节点,进行子树替换if (arr2.length > 1) {// 替换子树dfs(treeNode1, treeNode3, arr2, 1);} else {// 如果子二叉树根节点对应根二叉树的节点只有1个,则完全替换treeNode1 = treeNode3;}// 遍历输出结果Queue<TreeNode> queue = new LinkedList<>();queue.add(treeNode1);String result = "[";while (!queue.isEmpty()) {TreeNode node = queue.poll();result = result + node.val + ",";if (node.left != null) {queue.add(node.left);}if (node.right != null) {queue.add(node.right);}}result = result.substring(0, result.length() - 1) + "]";System.out.println(result);}// 建树public static TreeNode buildTree(int[] nums, int index) {TreeNode newNode = null;if (index < nums.length) {// 0表示空节点,如果不是空节点,则构建树if (nums[index] != 0) {// 根节点newNode = new TreeNode(nums[index]);newNode.left = buildTree(nums, 2 * index + 1);newNode.right = buildTree(nums, 2 * index + 2);}}return newNode;}/*** 替换子树* @param treeNode1 根二叉树* @param treeNode3 子二叉树* @param arr2 子二叉树根节点对应根二叉树的节点* @param i*/public static void dfs(TreeNode treeNode1, TreeNode treeNode3, int[] arr2, int i) {// 替換到最后一位,终止替换if (i == arr2.length - 1) {if (treeNode1.left != null && treeNode1.left.val == arr2[i]) {treeNode1.left = treeNode3;return;} else if (treeNode1.right != null && treeNode1.right.val == arr2[i]) {treeNode1.right = treeNode3;return;}}// 替换子树if (treeNode1.left != null && treeNode1.left.val == arr2[i]) {dfs(treeNode1.left, treeNode3, arr2, i + 1);} else if (treeNode1.right != null && treeNode1.right.val == arr2[i]) {dfs(treeNode1.right, treeNode3, arr2, i + 1);}}/*** 二叉樹*/public static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val = val;}}
}
六、效果展示
1、输入
[1,1,2,0,0,4,5]
/1/2
[5,3,0]
2、输出
[1,1,5,3]
3、说明
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷+C卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。