题目

 
 题目链接:
 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;
}



















