题目:重建二叉树
描述:
输入某二叉树的前序遍历和中序遍历的结果,请重新构建该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。例如输入的前序遍历序列为{5,2,1,7,6,9}和中序遍历为{1,2,5,6,7,9},则重建出二叉树并输出它的头结点。
思路:利用前序遍历根节点左右俩侧是左右子树,中序遍历第一个节点就根节点的特性,将一棵树细分成很多子树,从根节点往下构造。
Map<Integer,Integer> map = new HashMap<>();
public TreeNode fill(int[] pre,int[] in) {
for (int i = 0; i < in.length; i++) {
map.put(in[i],i);
}
return reBuild(pre,0,pre.length -1,0);
}
// pre[] 前序遍历 preL:当前前序遍历数组的最左侧 preR:当前前序遍历数组的最右侧 inL中序遍历的最左侧
public TreeNode reBuild(int[] pre,int preL,int preR,int inL) {
if (preL > preR) {
return null;
}
TreeNode root = new TreeNode(pre[preL]);
// 得到该节点的下标
int inIndex = map.get(root.value);
// 左子树的大小
int lTreeSize = inIndex - inL;
// 递归左边的子树
root.left = reBuild(pre,preL + 1,preL + lTreeSize,inL);
// 递归右边的子树 inL + lTreeSize + 1:当前中序遍历数组的最左侧元素
root.right = reBuild(pre,preL + lTreeSize + 1,preR,inL + lTreeSize + 1);
return root;
}
}
class TreeNode {
TreeNode left;
TreeNode right;
int value;
public TreeNode(int value) {
this.value = value;
}
}
利用前序后续遍历的特性,重新构建二叉树。