- 前序遍历顺序:根,左,右。中序遍历顺序:左,根,右。
- 一棵树,无论怎么遍历,元素总数是不变的。
- 在实际遍历的时候,前,中,后序遍历,各种遍历方式左右子树的节点都是在一起的。
- 由于前序遍历从根开始,所以根据前序结果可以将中序结果分为左树和右树。
- 根据从中序里分出的左树和右树,可以在前序中找出对应的左树和右树。
- 所以重点是要确定好中序的左树和右树对应的前序的左树和右树的下标。
- 通过递归得到完整的二叉树,每次递归确定一个root的左树和右树。
- 中序的左树和右树对应的前序的左树和右树的下标如下图:
- 图中所标preStart就是第一个根,在中序遍历结果中对应下标记为i
- 左树长度:i-inStart+preStart
- preEnd:pre.length-1
- inEnd:in.length-1
-
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] vin) { return creat(0,pre.length-1,pre,0,vin.length-1,vin); } public TreeNode creat(int pres,int pree,int[]pre,int vins,int vine,int []vin){ //越界直接返回 if(pres>pree)return null; //前序遍历范围的第一个结点就是根节点 int rootval=pre[pres]; int index=0; //在中序范围找到根节点的值 for(int i=vins;i<=vine;i++){ if(vin[i]==rootval){ index=i; break; } } int len=index-vins; TreeNode root=new TreeNode(rootval); root.left=creat(pres+1,pres+len,pre,vins,index-1,vin); root.right=creat(pres+len+1,pree,pre,index+1,vine,vin); return root; } }