题解 | #重建二叉树#
重建二叉树
http://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6
重建二叉树 用java构造树真麻烦,还没有无参构造方法,吐槽。。。,时间击败99.4的提交用户,骄傲😁
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
List<Integer> preList = new ArrayList();
List<Integer> vinList = new ArrayList();
for(int i : pre){
preList.add(new Integer(i));
}
for(int i : vin){
vinList.add(new Integer(i));
}
TreeNode root = new TreeNode(0);
root = we(root,preList,vinList);
return root;
}
public TreeNode we(TreeNode root,List<Integer> pre,List<Integer> vin) {
if(pre.size()==0 || vin.size()==0){
// root = null;
return null;
}
if(root == null){
root = new TreeNode(0);
}
List<Integer> preListl = new ArrayList();
List<Integer> vinListl = new ArrayList();
List<Integer> preListr = new ArrayList();
List<Integer> vinListr = new ArrayList();
Set<Integer> lift=new HashSet<>();
Set<Integer> right=new HashSet<>();
int w=0;
for(int i=0;i< vin.size();i++){
if(vin.get(i).equals(pre.get(0))){
w=i;
root.val = pre.get(0).intValue();
break;
}
}
for(int i=0;i<w;i++){
vinListl.add(vin.get(i));
lift.add(vin.get(i));
}
for(Integer i : pre){
if(lift.contains(i)){
preListl.add(i);
}
}
System.out.println(preListl);
System.out.println(vinListl);
if(preListl.size()!=0) {
root.left = new TreeNode(0);
}
we(root.left,preListl,vinListl);
for(int i=w+1;i<vin.size();i++){
vinListr.add(vin.get(i));
right.add(vin.get(i));
}
for(Integer i : pre){
if(right.contains(i)){
preListr.add(i);
}
}
System.out.println(preListr);
System.out.println(vinListr);
if(preListr.size()!=0){
root.right = new TreeNode(0);
}
we(root.right,preListr,vinListr);
return root;
}
}