重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
树的遍历方式:
- 前序遍历:先访问根节点,再访问左子节点,最后访问右子节点;
- 中序遍历:先访问左子节点,再访问根节点,最后访问右子节点;
- 后序遍历:先访问左子节点,再访问右子节点,最后访问根节点。
这三种遍历方式都有递和循环两种实现方法,
代码
import java.util.HashMap;
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){
val = x;
}
public String toString(){
return Integer.toString(val);
}
}
public class reconstructTree {
public static TreeNode reConstructBinaryTree(int[] pre, int[] in){
if(pre == null || in == null){
return null;
}
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i=0; i<in.length; i++){
map.put(in[i], i);
}
return preIn(pre, 0, pre.length-1, in, 0, in.length-1, map);
}
public static TreeNode preIn(int[] p, int pi, int pj, int[] n, int ni, int nj, HashMap<Integer, Integer> map){
if(pi > pj){
return null;
}
// 创造根节点,根节点是前序遍历的第一个数
TreeNode root = new TreeNode(p[pi]);
int index = map.get(p[pi]);
// 构建左子树
root.left = preIn(p, pi+1, pi+index-ni, n, ni, index-1, map);
// 构建右子树
root.right = preIn(p, pi+index-ni+1, pj, n, index+1, nj, map);
return root;
}
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};
System.out.println(reConstructBinaryTree(pre, in));
}
}