public static Tree buildTree(int array[], int index){ Tree head= null; if(index 完整代码如下:

import java.util.*;
public class Solution2 {
    //定义二叉树的结构
    public static class Tree{
        int val;
        Tree left;
        Tree right;
        Tree(int val){
            this.val = val;
    //数组建树
    public static Tree buildTree(int array[], int index){
        Tree head= null;
        if(index<array.length){
            int cur = array[index];
            if(cur!=0) {
                head = new Tree(cur);
                head.left =  buildTree(array,2*index+1);
                head.right =  buildTree(array,2*index+2);
        return head;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //处理根二叉树
        String str1 = sc.nextLine();
        String []s1 = str1.substring(1,str1.length()-1).split(",");
        int arr1[] = new int[s1.length];
        for(int k=0;k<arr1.length;k++){
            arr1[k] = Integer.parseInt(s1[k]);
        //处理路径
        String str2 = sc.nextLine();
        String[] s2 = str2.substring(1).split("/");
        int[] arr2 = new int[s2.length];
        for (int i = 0; i < s2.length; i++) {
            arr2[i] = Integer.parseInt(s2[i]);
        //处理子二叉树
        String str3 = sc.nextLine();
        String []s3 = str3.substring(1,str3.length()-1).split(",");
        int arr3[] = new int[s3.length];
        for(int k=0;k<arr3.length;k++){
            arr3[k] = Integer.parseInt(s3[k]);
        Tree tree = buildTree(arr1,0);
        Tree childTree = buildTree(arr3,0);
        //特殊情况,完全替换
        if(arr2.length==1){
            tree = childTree;
        else {
            //遍历找到对应节点
            Tree cur = tree;
            //根节点直接匹配到
            int index = 0;
            for(int k=1; ; k++){
                if(arr1[2*index+1]==arr2[k]){
                    index = 2*index+1;
                    //最后一个节点匹配到,退出
                    if(k+1==arr2.length){
                        cur.left =childTree;
                        break;
                    cur = cur.left;
                }else if(arr1[2*index+2]==arr2[k]){
                    index = 2*index+2;
                    //最后一个节点匹配到,退出
                    if(k+1==arr2.length){
                        cur.right =childTree;
                        break;
                    cur = cur.right;
        Queue<Tree>queue = new LinkedList<>();
        queue.add(tree);
        String res="[";
        while (!queue.isEmpty()){
            Tree node = queue.poll();
            res = res + node.val +",";
            if(node.left!=null){
                queue.add(node.left);
            if(node.right!=null){
                queue.add(node.right);
        //去掉最后一个逗号
        res = res.substring(0, res.length()-1) + "]";
        System.out.println(res);
                    这是华为第二道200分的题,考的是树的基本结构。将一颗子二叉树按照路径替换到另一颗根二叉树中,得到一颗新的二叉树。替换动作满足如下条件:1.子树的根节点完全替换根二叉树对应的节点2.子树根节点下的子树完全保留3.根二叉树的对应节点下的子树完全删除输入输入为3行第一行:一个数组,表示根二叉树。二叉树的每个节点在1到9之间,包含1和9,空节点用0表示。第二行:一个字符串,表示子二叉树根节点对应根二叉树的节点,如“/1/2”对应(每个节点下不存在相同的子节点,即pa
同一节点,子二叉树和根二叉树同时存在,则取子二叉树的值
同一节点,子二叉树存在,根二叉树不存在,则取子二叉树的值
同一节点,子二叉树不存在,根二叉树存在,则取根二叉树的值
父节点处理完后,递归处理子节点,直至子二叉树和根二叉树都不存在子节点时退出
*  给出一颗二叉树,每个节点有一个编号和一个值,该值可能为负数,
* 请你找出一个最优节点(除根节点外),使得在该节点将树分成两棵树后
* (原来的树移除这个节点及其子节点,新的树以该节点为根节点),分成
* 的两棵树各节点的和之间的差绝对值最大。请输出该节点编号,如有多个
* 相同的差,输出编号最小的节点。
* 输入描述:
*  4 9 -7 -8
*  0 1
*  0 3
				
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。 可以使用深度优先搜索合并两个二叉树。从根节点开始同时遍历两个二叉树,并将对应的节点进行合并。 两个二叉树的对应节点可能存在以下三种情况,对于每种情况使用不同的合并方式。 如果两个二叉树的对应节点都为空,则合并后的二叉树的对应节点也为空; 如果两个二叉树的对应
题目链接:https://leetcode-cn.com/problems/merge-two-binary-trees 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。 返回合并后的二叉树。 注意: 合并过程必须从两个树的根节点开始。 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为NULL 的节点将直接作为新二叉树的节点。 Tree 1 Tree 2 1 2 ...
合并二叉树 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。 返回合并后的二叉树。 注意: 合并过程必须从两个树的根节点开始。 示例 1: 输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7] 算法思路: 二叉查找树能快速找到目标节点,因为左边节点小于右边节点,可以用二分思想来优化查找速度。通过递归,比较当前节点值和目标节点值的大小,若相等则返回当前层数即可,若目标节点值小于当前节点值,则向左子树递归查找,否则向右子树递归查找。如果找到节点则返回当前层数,如果递归到叶子节点仍未找到,返回-1。 代码实现: class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class Solution: def searchBST(self, root: TreeNode, val: int) -> int: if root.val == val: return 1 elif val < root.val and root.left: return self.searchBST(root.left, val) + 1 elif val > root.val and root.right: return self.searchBST(root.right, val) + 1 else: return -1 测试样例: root = TreeNode(4) root.left = TreeNode(2) root.right = TreeNode(7) root.left.left = TreeNode(1) root.left.right = TreeNode(3) s = Solution() print(s.searchBST(root, 2)) # 2 print(s.searchBST(root, 5)) # -1 代码解释: 首先定义了一个节点类,包含节点值、左子树和右子树。然后是主要代码部分,将树的根节点和目标节点值作为参数传入函数中。如果当前节点值等于目标节点,则返回当前层数1。如果目标节点值小于当前节点值,且左子树存在,则将目标节点值和左子节点作为参数递归调用函数,返回值加1。如果目标节点值大于当前节点值,且右子树存在,则将目标节点值和右子节点作为参数递归调用函数,返回值加1。如果目标节点不在树中,返回-1。最后的测试样例中,对于二叉树的根节点的左子树中的值为2的节点,输出的结果是2;对于不存在于二叉树中的节点值为5的节点,输出的结果是-1。