剑指offer4.重建二叉树

261 阅读1分钟

4.重建二叉树

描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路:前序遍历:根->左->右 中序遍历:左->根->右 所以: 1.根据前序序列的第一个值得到根节点 1 2.在中序序列中找到根节点在其中的位置in[3],那么在其左边的就是左子树{4,7,2},右边的就是右字树{5,3,8,6} 那么就可以确定前序中的左子树{2,4,7}和右子树{3,5,6,8} 3.再分别在左、右字数中递归地重复上述操作即可。

复杂度:都是O(n)

代码: public TreeNode reConstructBinaryTree(int [] pre,int [] in) { if(pre.length==0||in.length==o){ return null; } TreeNode root=new TreeNode(pre[0]); //在前序中找到根节点 for(int i=0;i<in.length;i++){ //在中序中遍历找到根节点所在的位置 if(in[i]==root){ root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i); root.right=reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length); break; } return root; }//注意Arrays.copyOfRange(数组,复制的起始位(包括这个),复制的终止位(不包含它))是一个复制数组的函数。