重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:
1、前序遍历的第一个元素是二叉树的根元素,根据根元素在中序遍历中将中序遍历数组划分左子树和右子树。
2、根据左子树的中元素数量在前序遍历中将前序遍历数组划分出左子树和右子树。
3、采用递归,将前序遍历的左子树和中序遍历的左子树视为新的二叉树,前序遍历的右子树和中序遍历的右子树视为新的二叉树。
4、返回根节点
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode root = reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
return root;
}
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;
}
}