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

news/2024/7/20 22:53:10 标签: 深度优先, 算法

题目

在这里插入图片描述
在这里插入图片描述
题目链接:
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.niftyadmin.cn/n/5452653.html

相关文章

优雅地处理前端数据转换:自定义封装 translateDict 函数

在前端开发中&#xff0c;我们经常需要处理数据的转换。有时候&#xff0c;我们需要将某种格式的数据转换为另一种格式&#xff0c;这可能涉及到字符串、数组等不同数据类型的转换。在这篇博客中&#xff0c;我们将介绍一个名为 translateDict 的函数&#xff0c;它可以帮助我们…

STM32 库函数 3*4矩阵键盘

1、矩阵按键扫描原理&#xff1a; 先是把列置0&#xff08;推挽输出&#xff09;&#xff0c;行是输入上拉&#xff0c;扫描行得到行的键值&#xff1b;再是把行置0&#xff08;推完输出&#xff09;&#xff0c;列是输入上拉&#xff0c;扫描列得到列的键值&#xff1b;最后把…

USB Network Native Driver for ESXi 8.0U1 (v1.12) and 8.0U2 (v1.13)

因为 VMware 在被 Broadcom 收购后关闭了 Flings 网站&#xff0c;此社区版驱动文档迁移到了 USB Network Native Driver for ESXi Documentation - VMware Technology Network VMTN 之前发布的8.0U1 和 8.0U2 的下载链接暂时无法从 VMware 官网获得&#xff0c;不过有网友事先…

蓝桥杯2021年第十三届省赛真题-直线

一、题目 【问题描述】 在平面直角坐标系中&#xff0c;两点可以确定一条直线。如果有多点在一条直线上&#xff0c;那么这些点中任意两点确定的直线是同一条。 给定平面上 2 3 个整点 {(x, y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z}&#xff0c;即横坐标是 0 到 1 (…

微信小程序之多视频暂停播放,超出可视区域停止播放视频在自定义组件中实现案例

项目页面存在多个视频时&#xff0c;只播放视频可见范围内单个视频播放的解决方案 QQ录屏20240326175303 在自定义组件中无onPageScroll(e)监听页面滚动的函数所以在自定义组件中用<scroll-view>标签包裹所有组件&#xff08;以下为WXML页面源码&#xff09; <scroll…

零拷贝技术、常见实现方案、Kafka中的零拷贝技术的使用、Kafka为什么这么快

目录 1. 普通拷贝 2. 数据拷贝基础过程 2.1 仅CPU方式 2.2 CPU&DMA方式 3.普通模式数据交互 4. 零拷贝技术 4.1 出现原因 4.2 解决思路 4.2.1 mmap方式 4.2.2 sendfile方式 4.2.3 sendfileDMA收集 4.2.4 splice方式 5. Kafka中使用到的零拷贝技术 参考链接 本…

Spring Cloud Gateway 3.x 获取body中的数据鉴权

前言 SpringCloud Gateway建立在Spring Framework5、Project Reactor和Spring Boot2.0之上&#xff0c;使用WebFlux非阻塞API 什么是WebFlux? 官网&#xff1a;https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html 传统的Web框架&…

CMake学习笔记(一)一个最简单的CMakeLists嵌套示例

目录 1 mkdir project_macro 2 在project_marco中建立CMakeLists.txt 3 建立专门的src文件夹 4 在src中添加main.cpp和CMakeLists.txt 5 回到project_macro目录&#xff0c;建立build文件夹 6 进入build 文件夹&#xff0c;开始cmake 7 在build文件夹里执行make指令 8 …