题目:重建二叉树
考点:树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
法一:递归法1,比较简洁易懂
1 import java.util.*; 2 /** 3 * Definition for binary tree 4 * public class TreeNode { 5 * int val; 6 * TreeNode left; 7 * TreeNode right; 8 * TreeNode(int x) { val = x; } 9 * } 10 */ 11 import java.util.Arrays; 12 public class Solution { 13 public TreeNode reConstructBinaryTree(int [] pre,int [] in) { 14 if(pre.length == 0 || in.length == 0){ 15 return null; 16 } 17 //前序:{1,2,4,7,3,5,6,8} 中序:{4,7,2,1,5,3,8,6} 18 TreeNode node = new TreeNode(pre[0]); 19 for(int i = 0; i < in.length; i++){ 20 if(pre[0] == in[i]){ 21 //注意边界问题 22 //如i=3时,in[i]==pre[0],则中序{4,7,2,1,5,3,8,6}分为左边{4,7,2}和右边{5,3,8,6}。所以left的前序数组只需拷贝从[1,i+1)即可。 23 node.left = this.reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i)); 24 node.right = this.reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length)); 25 } 26 } 27 return node; 28 } 29 }
Arrays提供了一个copyOfRange方法进行数组复制。
Arrays.copyOfRange()的格式如下:
1 copyOfRange(int[] original, int from, int to)
-
第一个参数表示源数组
-
第二个参数表示开始位置(取得到)
-
第三个参数表示结束位置(取不到)
法二:递归法2
1 import java.util.*; 2 /** 3 * Definition for binary tree 4 * public class TreeNode { 5 * int val; 6 * TreeNode left; 7 * TreeNode right; 8 * TreeNode(int x) { val = x; } 9 * } 10 */ 11 import java.util.Arrays; 12 public class Solution { 13 public TreeNode reConstructBinaryTree(int [] pre,int [] in) { 14 TreeNode node = reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1); 15 return node; 16 } 17 //重载 18 private TreeNode reConstructBinaryTree(int [] pre,int startPre,int endPre,int [] in,int startIn,int endIn){ 19 //判断数组是否为空 20 if(startPre > endPre || startIn > endIn){ 21 return null; 22 } 23 TreeNode node = new TreeNode(pre[startPre]); 24 for(int i = startIn; i <= endIn; i++){ 25 if(pre[startPre] == in[i]){ 26 //注意边界 27 node.left = reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1); 28 node.right = reConstructBinaryTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn); 29 break; 30 } 31 32 } 33 return node; 34 } 35 }