重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

解答

前序遍历的第一个元素代表当前的根节点,中序遍历中对应的元素将其分为两部分,左部分代表左子树,右部分代表右子树。

1544751466763

public class Solution {
    public static TreeNode buildTree(int[] pre, int[] in) {
        TreeNode root = new TreeNode(pre[0]);

        int j = 0;
        for ( ; j < in.length; j++) {
            if (in[j] == pre[0]) break;
        }

        int[] childLpre = new int[j];
        for(int i = 0; i < j; i++){
            childLpre[i] = pre[i+1];
        }

        int[] childLin = new int[j];
        for (int i = 0; i<j; i++){
            childLin[i] = in[i];
        }

        int[] childRpre = new int[in.length-j-1];
        for(int i = 0; i<in.length-j-1; i++){
            childRpre[i] = pre[j+i+1];
        }

        int[] childRin = new int[in.length-j-1];
        for(int i = 0; i<in.length-j-1; i++){
            childRin[i] = in[j+i+1];
        }

        if (childLin.length > 0) root.left = buildTree(childLpre, childLin);
        if (childRin.length > 0) root.right = buildTree(childRpre, childRin);

        return root;
    }

    public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
        return buildTree(pre, in);
    }
}

待完成:不使用额外数组

import org.junit.Test;
public class Solution {
    public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
        int lenPre = pre.length;
        int lenIn = in.length;

        if (lenPre <= 0 || lenIn <= 0) return null;

        return reConstruct(pre, in, 0, lenPre - 1, 0, lenIn - 1);
    }

    public TreeNode reConstruct(int[] pre, int[] in, int startP, int endP, int startI, int endI) {

        if (startI > endI || startP > endP) return null;

        TreeNode root = new TreeNode(pre[startP]);
        if (startI != endI) {
            int i = findNumber(in, startI, endI, pre[startP]);
            int des = i - startP;

            root.left = reConstruct(pre, in, startP + 1, 0, i + 1, endP);
            root.right = reConstruct(pre, in, 0, 0, 0, endI);
        }
        return root;
    }

    public int findNumber(int[] nums, int start, int end, int target) {
        for (int i = start; start <= end; i++) {
            if (target == nums[i]) return i;
        }

        return -1;
    }

    @Test
    public void test() {
        int[] pre = {1, 2, 4, 7, 3, 5, 6, 8};
        int[] in = {4, 7, 2, 1, 5, 3, 8, 6};
        TreeNode treeNode = reConstructBinaryTree(pre, in);
        System.out.println("");
    }
}
内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译与训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
内容概要:该论文针对新型电力系统中非线性负荷和分布式电源接入导致的电能质量扰动识别难题,提出了一种结合优化广义S变换(OGST)和混合输入神经网络的方法。OGST通过自适应选取高斯窗函数参数保留扰动信号的幅值和频率特征;混合输入神经网络分别处理原始时间序列和时频矩阵,融合两种特征后识别扰动类型。实验表明,该方法在26种扰动类型的仿真数据上识别准确率达99.77%,在实际电网信号上达到92.5%,优于传统单一输入神经网络。论文还提供了详细的代码实现,包括优化广义S变换、电能质量扰动信号生成、混合输入神经网络模型构建及训练流程。 适合人群:具备一定编程基础,特别是对电能质量监测、信号处理和深度学习感兴趣的工程师和研究人员。 使用场景及目标:①适用于电力系统中的电能质量监测,特别是智能变电站和新能源电站的并网检测;②通过OGST和混合输入神经网络,提高对复杂电能质量扰动的识别准确率和鲁棒性;③支持实时处理和边缘计算部署,满足工业场景的实时性和资源限制要求。 其他说明:该方法不仅在理论上创新,而且在实际应用中表现出色。通过参数优化和混合输入架构,能够有效应对不同类型的电能质量扰动。此外,论文还提供了完整的代码实现和实验验证,便于读者复现实验结果并应用于实际项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值