【解题思路】
先在先序序列中取出当前的根节点(第一个节点),在中序序列的找到该节点的索引,该节点左边的是根节点的左子树,该节点右边的是根节点的右子树。分别找到左右子树的先序、中序序列,递归向下建立子树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
TreeNode T = new TreeNode();
int len = preorder.length;
if(len == 0)
{
T = null;
}
else
{
int num = preorder[0];
int index = 0, i;
//先序中找到根节点
for(i = 0; i < inorder.length; i++)
{
if(inorder[i] == num)
{
index = i;
break;
}
}
int[] l_pre = new int[index];
int[] l_in = new int[index];
int[] r_pre = new int[len-index-1];
int[] r_in = new int[len-index-1];
for(i = 0; i < index; i++)
{
l_pre[i] = preorder[i+1]; //左子树的先序序列
l_in[i] = inorder[i]; //左子树的中序序列
}
for(i = 0; i < len-index-1; i++)
{
r_pre[i] = preorder[i+index+1]; //右子树的先序序列
r_in[i] = inorder[i+index+1]; //右子树的中序序列
}
T.val = num;
T.left = buildTree(l_pre, l_in);
T.right = buildTree(r_pre, r_in);
}
return T;
}
}