您的位置:首页 > Web前端

重建二叉树 剑指offer

2016-09-14 18:36 239 查看
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
import java.util.Scanner;

public class Solution {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Solution solution = new Solution();
//		int[] pre= {1,2,4,7,3,5,6,8};
//		int[] in = {4,7,2,1,5,3,8,6};
Scanner s = new Scanner(System.in);
while(s.hasNextLine()){
String string1 = s.nextLine();
String string2 = s.nextLine();
String[] strArr1 = string1.split(",");
String[] strArr2 = string2.split(",");
int[] pre = new int[strArr1.length];
int[] in = new int[strArr2.length];
for(int i=0; i<pre.length; i++){
pre[i] = Integer.parseInt(strArr1[i]);
in[i] = Integer.parseInt(strArr2[i]);
}
TreeNode root = solution.reConstructBinaryTree(pre, in);
System.out.print(root.value);System.out.print(root.left.value);System.out.print(root.right.value);
System.out.print(root.left.left.value);System.out.print(root.left.left.right.value);
}

}
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0){
return null;
}
TreeNode root = new TreeNode();
root.value = pre[0];
int sep = 0;
for(int i=0; i<in.length; i++){//求中序的分割点,即根结点位置
if(in[i]==pre[0]){
sep = i;
break;
}
}
int[] pre1 = new int[sep];
int[] in1 = new int[sep];
for(int i=1; i<sep+1; i++){//求前序
pre1[i-1] = pre[i];
}
for(int i=0; i<sep; i++){//求中序
in1[i] = in[i];
}
root.left = reConstructBinaryTree(pre1, in1);
//右子树
int[] pre2 = new int[pre.length-sep-1];
int[] in2 = new int[pre2.length];
for(int i=sep+1; i<pre.length; i++){
pre2[i-sep-1] = pre[i];
}
for(int i=sep+1; i<in.length; i++){
in2[i-sep-1] = in[i];
}
root.right = reConstructBinaryTree(pre2, in2);
return root;
}
}
class TreeNode{
int value;
TreeNode left;
TreeNode right;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: