牛客NC12 重建二叉树【中等 dfs Java,Go,PHP】

news2024/9/21 18:38:55

题目

在这里插入图片描述
在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6

思路

先序遍历第一个值就是根节点,根据这个值可以在中序中划分左右子树,
我们这里已经将一个数划分成两颗子树,那么在递归的使用刚刚的分析可以继续分开,
直到叶子节点。

参考答案Java

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param preOrder int整型一维数组
     * @param vinOrder int整型一维数组
     * @return TreeNode类
     */
    public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < vinOrder.length ; i++) {
            map.put(vinOrder[i], i);
        }
        return f1(preOrder, 0, preOrder.length - 1, vinOrder, 0, vinOrder.length - 1,
                  map);
    }

    public TreeNode f1(int[] pre, int l1, int r1, int[] in, int l2, int r2,
                       Map<Integer, Integer> map) {
        if (l1 > r1) return null;
        if (l1 == r1) return new TreeNode(pre[l1]);
        else {
            TreeNode root = new TreeNode(pre[l1]);
            int index = map.get(pre[l1]);
            root.left = f1(pre, l1 + 1, l1 + index - l2, in, l2, index - 1, map);
            root.right = f1(pre, l1 + index - l2 + 1, r1, in, index + 1, r2, map);
            return root;
        }
    }
}

参考答案Go

package main
import . "nc_tools"

/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param preOrder int整型一维数组
 * @param vinOrder int整型一维数组
 * @return TreeNode类
 */
func reConstructBinaryTree(preOrder []int, vinOrder []int) *TreeNode {
	indexMap := map[int]int{}
	for i := 0; i < len(vinOrder); i++ {
		indexMap[vinOrder[i]] = i
	}

	return dfs(preOrder, 0, len(preOrder)-1, vinOrder, 0, len(vinOrder)-1, indexMap)
}

func dfs(preOrder []int, l1 int, r1 int, vinOrder []int, l2 int, r2 int, imap map[int]int) *TreeNode {
	if l1 > r1 {
		return nil
	}

	 if l1 == r1 {
		return &TreeNode{preOrder[l1], nil, nil}
	}

	root := &TreeNode{preOrder[l1], nil, nil}
	index,_ := imap[preOrder[l1]]

	root.Left = dfs(preOrder, l1+1, l1+index-l2, vinOrder, l2, index-1, imap)
	root.Right = dfs(preOrder, l1+index-l2+1, r1, vinOrder, index+1, r2, imap)

	return root
}

参考答案PHP

<?php

/*class TreeNode{
    var $val;
    var $left = NULL;
    var $right = NULL;
    function __construct($val){
        $this->val = $val;
    }
}*/

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param preOrder int整型一维数组 
 * @param vinOrder int整型一维数组 
 * @return TreeNode类
 */
function reConstructBinaryTree( $preOrder ,  $vinOrder )
{
 $imap =array();
    for($i=0;$i<count($vinOrder);$i++){
        $imap[$vinOrder[$i]] = $i;
    }

    return dfs($preOrder,0,count($preOrder)-1,$vinOrder,0,count($vinOrder)-1,$imap);
}

function dfs($pre,$l1,$r1,$in,$l2,$r2,$imap){
    if($l1>$r1) return null;
    if($l1==$r1) return new TreeNode($pre[$l1]);
    $root = new TreeNode($pre[$l1]);
    $index = $imap[$pre[$l1]];
    $root->left = dfs($pre,$l1+1,$l1+$index-$l2,$in,$l2,$index-1,$imap);
    $root->right = dfs($pre,$l1+$index-$l2+1,$r1,$in,$index+1,$r2,$imap);
    return $root;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1546197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型时代的向量数据库:原理解析和应用案例

大家好&#xff0c;在人工智能领域&#xff0c;数据处理和加工的需求愈发增加。随着人们深入探索AI高级的应用&#xff0c;如图像识别、语音搜索和推荐引擎等&#xff0c;数据的复杂性也在不断地增加。此时传统的数据库存储方式已不能完全满足需求&#xff0c;向量数据库应运而…

大模型知识点汇总——分布式训练

PS&#xff1a;本篇只在宏观上介绍相关概念和技术&#xff0c;不做数学推导和过于细节介绍&#xff0c;旨在快速有一个宏观认知&#xff0c;不拘泥在细节上&#xff0c;导致很混乱。 涉及技术名词 分布式框架等涉及的技术名词很多&#xff0c;很容易让人眼花缭乱&#xff0c;…

vdat文件分段了怎么合并成MP4?批量导入一键合并!

一些监控摄像头、视频录像软件或其他专用设备可能会生成vdat文件作为其录制的视频数据文件。一些浏览器比如夸克下载的视频也会出现vdat格式&#xff0c;因为流媒体播放采用的是分段加载&#xff0c;在网络不好的时候&#xff0c;重新加载对文件整体性损坏比较小&#xff0c;所…

springboot 中Aop注解切面实现收集日志与统计耗时2

一 Aop注解实现切面 1.1 工程结构 Before&#xff1a;前置通知, 在方法执行之前执行 Aroud&#xff1a;环绕通知, 围绕着方法执行 After&#xff1a;后置通知, 在方法执行之后执行 AfterReturning&#xff1a;返回通知, 在方法返回结果之后执行 AfterThrowing&#xff1a;异…

su怎么做展厅模型---模大狮模型网

要在SketchUp中创建展厅模型&#xff0c;你可以按照以下基本步骤进行&#xff1a; 绘制基本结构&#xff1a; 使用SketchUp的绘图工具(线条、矩形、圆形等)来创建展厅的基本结构&#xff0c;包括墙壁、地板和天花板等。确保按照实际尺寸和比例进行绘制。 添加家具和展品&…

vue学习日记18:data是一个函数组件通信

一、data是一个函数 1.概念 2.代码 相互独立互不影响 二、组件通信 1.概念 &#xff08;1&#xff09;什么是组件通信 &#xff08;2&#xff09;不同组件关系和组件通信方案分类 &#xff08;3&#xff09;组件通信解决方案 &#xff08;4&#xff09;父子通信流程图 -…

CrossOver虚拟机软件2024中文版最新功能介绍

CrossOver是一款由CodeWeavers公司开发的&#xff0c;运行在Mac和Linux操作系统下&#xff0c;能够模拟Windows系统应用运行环境的软件。它不需要用户单独安装Windows操作系统&#xff0c;就能让Windows平台上的应用程序在Mac和Linux上顺畅运行。CrossOver在技术上使用了Wine&a…

鸿蒙开发之了解ArkTS

鸿蒙开发者官网 &#xff1a; https://developer.huawei.com/consumer/cn/ 开发鸿蒙要用的软件是 DevEco Studio ArkTS建立在JS和TS的基础之上&#xff0c;扩展了声明式UI开发范式和状态管理&#xff0c;提供更简洁和自然的开发方式。 ArkTS引入了渲染引擎的增强&#xff0c…

第 1 章.提示词:开启AI智慧之门的钥匙

什么是提示词&#xff1f; 提示词&#xff0c;是引导语言模型的指令&#xff0c;让用户能够驾驭模型的输出&#xff0c;确保生成的文本符合需求。 ChatGPT&#xff0c;这位文字界的艺术大师&#xff0c;以transformer架构为基石&#xff0c;能轻松驾驭海量数据&#xff0c;编织…

office办公技能|word中的常见使用问题解决方案2.0

一、设置多级列表将表注从0开始&#xff0c;设置为从1开始 问题描述&#xff1a;word中插入题注&#xff0c;出来的是表0-1&#xff0c;不是1-1&#xff0c;怎么办&#xff1f; 写论文时&#xff0c;虽然我设置了“第一章”为一级标题&#xff0c;但是这三个字并不是自动插入的…

【Docker】Docker安全与最佳实践:保护你的容器化应用程序

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

GEE显示研究区sentinel-2每年可用影像

第一次使用GEE&#xff0c;用了别人的代码&#xff0c;想查看每年影像可用数量&#xff0c;但是老是报错&#xff0c;说是null geometry&#xff0c;之前我是用GAMMA软件导出的kml文件&#xff0c;后面在arcgis自己勾画了sho文件&#xff0c;线类型&#xff0c;然后我就在想会不…

AI 工具到底要怎么用,老板才满意?

AI 大模型&#xff08;GPT-3.5&#xff09;从问世到现在广泛应用&#xff0c;已经一年多时间&#xff0c;去年 8 月&#xff0c;我们曾经探讨过“有了 AI 大模型&#xff0c;人工客服就没用了&#xff1f;”这个话题&#xff0c;彼时百模大战如火如荼&#xff0c;AI 创业公司风…

Vant Weapp小程序 van-uploader 文件上传点击无反应,删除无反应

Vant Weapp 1.0 版本开始支持van-uploader组件&#xff0c;请先确认好版本号和引用路径正确&#xff01;&#xff01; <van-uploader file-list"{{ fileList }}" deletable"{{ true }}" />1. 上传无反应 微信小程序用了van-uploader&#xff0c;但是…

kubernetes-k9s一个基于Linux 终端的集群管理工具

效果预览 下载 github 版本 此文档使用的版本是 v0.32.4&#xff0c;下载地址&#xff1a; https://github.com/derailed/k9s/releases/download/v0.32.4/k9s_linux_amd64.rpm 安装 rpm -ivh k9s_linux_amd64.rpm使用 启动 终端直接执行命令 k9s k9s基本操作 1 选择目…

进程状态究竟是什么?在Linux操作系统中具体存在哪些进程状态?

进程状态究竟是什么&#xff1f;在Linux操作系统中具体存在哪些进程状态&#xff1f; 前言一、操作系统中的进程状态1.1 运行状态1.2 阻塞状态和唤醒1.3 挂起状态 二、Linux操作系统中具体进程状态Linux中的进程状态种类2.1 R运行状态&#xff08;running&#xff09;2.2 前台进…

#GIT|Git Flow#Gitflow工作流程

Gitflow是一种使用功能分支和多个主分支的Git分支模型&#xff0c;它适用于有预定发布周期的项目&#xff0c;也适用于DevOps最佳实践中的持续交付。这个工作流程不会添加任何新的概念或命令&#xff0c;而是为不同的分支分配了非常具体的角色&#xff0c;并定义了它们应该如何…

什么是正向代理和反向代理?

从字面意思上看&#xff0c;代理就是代替处理的意思&#xff0c;一个对象有能力代替另一个对象处理某一件事。 代理&#xff0c;这个词在我们的日常生活中也不陌生&#xff0c;比如在购物、旅游等场景中&#xff0c;我们经常会委托别人代替我们完成某些任务。在技术领域&#…

官宣子品牌艾荷,坚定数字化赋能,鸿雁2024新春发布会助推40多年央企品牌焕新升级

3月25日&#xff0c;一场以“春江水暖雁先飞”为主题的2024鸿雁电器智能物联战略及新品发布会在杭州盛大召开。鸿雁电器总裁王米成、副总裁吴明、副总裁夏晓衍、市场部总经理梁彩雷、五金水暖渠道部总经理刘亮、灯饰与智能家居渠道部总经理王育炳等公司领导出席&#xff0c;以及…

SpringMvc之映射器HandlerMapping

简介 在springmvc的处理流程中&#xff0c;第一步就是查询请求对应的映射器&#xff0c;然后组装成处理器链处理请求&#xff0c;本文意在梳理该过程 重要实现 HandlerMapping是一个接口&#xff0c;该接口用于通过HttpServletRequest寻找对应的处理器&#xff0c;接口介绍如下…