(四)需要好好理解
题目表述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路: 前序:根结点-左孩子-右孩子 中序:左孩子-根结点-右孩子 后序:左孩子-右孩子-根节点。每次遇到一个根节点都要重新递归,从开始的根节点开始去遍历。

1 /** 2 * Definition for binary tree 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 public TreeNode reConstructBinaryTree(int [] pre,int [] in) { 12 TreeNode root = new TreeNode(pre[0]);//前序的第一个数字为根 13 int len = pre.length; 14 //当只有一个数的时候 15 if(len==1){ 16 root.left=null; 17 root.right=null; 18 return root; 19 } 20 //找到中序中的根位置 21 int rootval=root.val; 22 int i; 23 for(i=0;i<len;i++){ 24 if(rootval==in[i]) 25 break; 26 } 27 //创建左子树 28 if(i>0){ 29 int[] pr = new int[i]; 30 int[] ino = new int[i]; 31 for(int j=0;j<i;j++){ 32 pr[j]=pre[j+1]; 33 } 34 for(int j=0;j<i;j++){ 35 ino[j]=in[j]; 36 } 37 root.left=reConstructBinaryTree(pr,ino); 38 }else{ 39 root.left = null; 40 } 41 42 //创建右子树 43 if(len-i-1>0){ 44 int[] pr = new int[len-i-1]; 45 int[] ino = new int[len-i-1]; 46 for(int j=i+1;j<len;j++){ 47 ino[j-i-1]=in[j]; 48 pr[j-i-1]=pre[j]; 49 } 50 root.right = reConstructBinaryTree(pr,ino); 51 }else{ 52 root.right=null; 53 } 54 return root; 55 56 } 57 }

浙公网安备 33010602011771号