解题思路:首先确立使用递归的思路做题,每次递归构造一个节点。
传入的数组中前序数组pre的第一个元素就是根节点,将这个根节点的值赋给root,然后在中序数组tin中寻找这个元素。这个元素将tin数组分为两半,前半部分是左子树的节点们,后半部分是右子树的节点们
将tin按上述分法分为两个数组,同时pre数组也要照着这个思路分为左右子树两个子数组,然后递归求解,代码如下
public TreeNode reConstructBinaryTree(int[] pre, int[] tin)
{
if(pre.Length==0 || tin.Length==0)//若两个数组长度为0,则此时返回空
{
return null;
}
TreeNode root=new TreeNode(pre[0]);//将先序遍历的第一个节pre[0]点赋给root
for(int i=0;i<tin.Length;i++)//开始在中序遍历数组中寻找pre[0]的值所在的序号i
{
if(tin[i]==pre[0])
{
int[] tinLeft=new int[i];//分割包含所有左子树元素的子数组。数组由tin[0]~tin[i-1]组成,大小为i
int[] preLeft=new int[i];
for(int j=0;j<tinLeft.Length;j++)
{
tinLeft[j]=tin[j];
preLeft[j]=pre[j+1];//这里preLeft是除去第一个节点后,往后遍历i个值存入(往后遍历的这些值都是左子树的元素)
}
int[] tinRight=new int[tin.Length-i-1];//分割包含所有右子树元素的子数组。数组由tin[i+1]~tin[tin.Length-1]组成,大小为tin.Length-i-1
int[] preRight=new int[tin.Length-i-1];
for(int j=0;j<tinRight.Length;j++)
{
tinRight[j]=tin[i+1+j];
preRight[j]=pre[j+i+1];
}
root.left=reConstructBinaryTree(preLeft, tinLeft);//递归生成左右子树
root.right=reConstructBinaryTree(preRight,tinRight);
break;//一次递归中只需要找到一次
}
}
return root;
}