3,重建二叉树
题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
递归思想,每次将左右两颗子树当成新的子树进行处理,
中序的左右子树索引很好找,前序的开始结束索引通过计算中序中左右子树的大小来计算,
然后递归求解,直到startPre>endPre||startIn>endIn说明子树整理完到。
方法每次返回左子树活右子树的根节点
1
//pre:前序数组,preStart:前序数组开始之的索引 preEnd:前序数组结束索引 in:中序数组 vinStart:中序开始索引 VinEnd:中序结束索引
public static TreeNode reConstructBinaryTree(int [] pre,int preStart,int preEnd,int [] in,int vinStart,int vinEnd) { 2 if(preStart>preEnd || vinStart > vinEnd) 3 return null; 4 5 TreeNode root=new TreeNode(pre[preStart]);//设置开始为根节点 6 7 for(int i=vinStart;i<=vinEnd;i++){ 8 if(in[i]==pre[preStart]){//找到中序数组中的根节点位置 9 //preStart+1:根节点向前序数组中右移一位 i-1:中序数组中根节点向前移 10 root.left=reConstructBinaryTree(pre,preStart+1,i-vinStart+preStart,in,vinStart,i-1);
11 root.right=reConstructBinaryTree(pre,i-vinStart+preStart+1,preEnd,in,i+1,vinEnd); 12 break; 13 } 14 } 15 return root; 16 }

浙公网安备 33010602011771号