题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
package interview;
/**
* Definition for binary tree
*
*/
public class Solution2 {
public static void main(String[] args) {
int[] pre = new int[] { 1, 2, 4, 7, 3, 5, 6, 8 };
int[] in = new int[] { 4, 7, 2, 1, 5, 3, 8, 6 };
long startTime = System.currentTimeMillis();
for(int i =0; i< 100000; ++ i) {
new Solution2().reConstructBinaryTree2(pre, in);
}
long endTime = System.currentTimeMillis();
System.out.println("" + (endTime - startTime));
startTime = System.currentTimeMillis();
for(int i =0; i< 100000; ++ i) {
new Solution2().reConstructBinaryTree2(pre, in);
}
endTime = System.currentTimeMillis();
System.out.println("" + (endTime - startTime));
}
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public TreeNode reConstructBinaryTree2(int[] pre, int[] in) {
TreeNode root = reConstructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1);
return root;
}
// 前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}
private TreeNode reConstructBinaryTree(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) {
if (startPre > endPre || startIn > endIn)
return null;
TreeNode root = new TreeNode(pre[startPre]);
for (int i = startIn; i <= endIn; i++)
if (in[i] == pre[startPre]) {
root.left = reConstructBinaryTree(pre, startPre + 1, startPre + i - startIn, in, startIn, i - 1);
root.right = reConstructBinaryTree(pre, i - startIn + startPre + 1, endPre, in, i + 1, endIn);
}
return root;
}
public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
int[] aPreStart = new int[in.length];
int[] aPreEnd = new int[in.length];
int[] aInStart = new int[in.length];
int[] aInEnd = new int[in.length];
TreeNode[] aRootNodes = new TreeNode[in.length];
int count = 0;
// push the parameters
aPreStart[count] = 0;
aPreEnd[count] = pre.length - 1;
aInStart[count] = 0;
aInEnd[count] = in.length - 1;
TreeNode theRootNode = new TreeNode(pre[aPreStart[count]]);
aRootNodes[count] = theRootNode;
count++;
while (count > 0) {
int preStart = aPreStart[count - 1];
int preEnd = aPreEnd[count - 1];
int inStart = aInStart[count - 1];
int inEnd = aInEnd[count - 1];
TreeNode rootNode = aRootNodes[count - 1];
int root = pre[preStart];
//System.out.println("count is " + count);
count--;
if (preStart == preEnd) {
// leaf
continue;
} else {
int middle = -1;
for (int i = inStart; i <= inEnd; ++i) {
if (in[i] == root) {
middle = i;
break;
}
}
//System.out.println("middle is " + middle);
if (middle - 1 >= inStart) {
aInStart[count] = inStart;
aInEnd[count] = middle - 1;
aPreStart[count] = preStart + 1;
aPreEnd[count] = preStart + 1 + (middle - 1 - inStart + 1) - 1;
TreeNode leftNode = new TreeNode(pre[aPreStart[count]]);
rootNode.left = leftNode;
aRootNodes[count] = leftNode;
count++;
}
if (inEnd >= middle + 1) {
aInStart[count] = middle + 1;
aInEnd[count] = inEnd;
aPreStart[count] = preEnd - (inEnd - middle - 1 + 1) + 1;
aPreEnd[count] = preEnd;
TreeNode rightNode = new TreeNode(pre[aPreStart[count]]);
rootNode.right = rightNode;
aRootNodes[count] = rightNode;
count++;
}
}
}
return theRootNode;
}
}
分享到:
相关推荐
java-leetcode题解之Reconstruct a 2-Row Binary Matrix解题思路主要包含以下几个知识点: 1. 二进制矩阵理解:在计算机科学中,二进制矩阵指的是一个二维数组,其元素仅包含0和1。这类问题通常与图像处理、计算机...
【标题】"ReconstructFaceUsingEigenFaces_reconstruct_opencv_faces_python_e" 提示我们这个项目是关于使用OpenCV库在Python环境中通过Eigenfaces方法重建人脸的。Eigenfaces是一种早期的人脸识别技术,它通过...
在本项目"matlab开发-Reconstruct3D3wayFRET"中,主要涉及的是使用MATLAB进行三维重建算法的开发,特别针对N向微动显微镜的数据处理。这种技术通常应用于生物医学研究,例如细胞内分子相互作用的观察。接下来,我们...
* [Binary Search Tree](https://github.com/kamyu104/LeetCode#binary-search-tree) * [Breadth-First Search](https://github.com/kamyu104/LeetCode#breadth-first-search) * [Depth-First Search]...
在“wavelet_packetdecomposition_reconstruct2.m”这个脚本中,很可能包含了小波包分解和重构的MATLAB实现。通常,它会包含以下功能: 1. 加载信号数据。 2. 选择小波包基函数和分解层数。 3. 对信号进行小波包...
在本项目中,"wavelet_packetdecomposition_reconstruct_2_小波变换_小波变换能量_" 的标题暗示了我们将探讨小波包分解与重构,并特别关注小波变换的能量提取过程。描述中提到是用MATLAB来实现这一功能,MATLAB是...
《Learning to Reconstruct Botanical Trees from Single Images》这本书探讨了一个极具挑战性的课题——如何从单张图像中重建植物树的三维模型。这个任务在虚拟现实、环境模拟和植物研究等领域有着广泛的应用价值,...
在本项目中,“基于多种机器学习模型与深度学习模型的评论文本分类(Reconstruct the old YUN project.)”是一个关于人工智能领域,特别是机器学习和深度学习应用的实践案例。这个项目的目标是通过训练不同的算法来对...
"VesselTree_reconstruct-master"项目显然聚焦于这个主题,利用MATLAB编程环境进行实现。以下将详细介绍相关知识点: 1. **血管骨架提取**:这是图像处理中的一个基础步骤,目的是从二维或三维图像中提取出血管的...
在图像处理领域,图像重建是一项重要的技术,尤其在医学成像、遥感和科学成像中广泛应用。本项目是基于MATLAB实现的“简单反投影”算法,用于图像的重建,能够有效地展示图像细节,提高成像质量。...
计算机视觉练习,从物体的二视图还原3D结构
GitHub上是Reconstruct的原始源代码-该源代码于2007年最后一次编译,而Executible可在以下位置找到: : 软件 重建Windows和其他平台的下载 ( ) 使用帮助手册和example.ser(7.38MB)[版本1.1.0.0,2007年8月20...
备忘录重建:跨档案重播服务 Memento Reconstruct是一个基于memento api的统一重播系统,可跨多个现有存档提供。 该系统还部署在部署-Docker Memento Reconstruct支持通过Docker compose进行全面部署。 要使用,只需...
Connectome()的一组Reconstruct()数据文件和输出文件为输入。 MatlabCode目录中的所有代码都是由Larry Lindsay()开发的。 其余代码由Alex Baden作为Open Connectome Project的一部分开发,并获得Apache 2许可...
在信息安全领域,数据安全是至关重要的一个环节。本研究主要关注的是“Volume Shadow Copy Service”(VSS)技术,它是一种在Windows操作系统中用于创建卷影副本的功能,允许用户访问过去的NTFS卷数据。...
基于ORL人脸库 PCA人脸识别的人脸重建
学习通过菲涅耳衍射构造图像 介绍 In光学中,菲涅耳衍射方程用于基尔霍夫-菲涅耳衍射的近场衍射近似,可应用于近场中波的传播。 当从相对较近的物体观看时,它用于计算由穿过Kong或物体周围的波产生的衍射图样。...
接着,构建进化树(Reconstruct phylogenetic tree)涉及两种主要的算法:独立元素法和距离依赖法。独立元素法包括最大简约法(Maximum Parsimony methods)和最大可能性法(Maximum Likelihood methods),前者假设...
用小波变换实现医学图像的增强,重构小波变换的函数,实现该功能。