题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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;
}
}
分享到:
相关推荐
【标题】"ReconstructFaceUsingEigenFaces_reconstruct_opencv_faces_python_e" 提示我们这个项目是关于使用OpenCV库在Python环境中通过Eigenfaces方法重建人脸的。Eigenfaces是一种早期的人脸识别技术,它通过...
Since some existing methods based on binary tree didn’t use any effective constructing algorithm of binary tree, several improved multiclass SVM methods based on binary tree are proposed by using ...
在本项目"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),前者假设...
用小波变换实现医学图像的增强,重构小波变换的函数,实现该功能。