题目
思路
根据前序遍历找出根节点 在中序遍历中找到根节点对应的节点的下标
下标位置左侧就是左子树 下标位置右侧就是右子树
用递归的方式完成
class Solution {
public int preIndex = 0;
//根节点位置在前序遍历中对应的下标
//定义为全局的是因为我们用了递归的方法 如果定义在方法内 每次递归都会更新
public TreeNode buildTree(int[] preorder, int[] inorder) {
return buildTreeChild(preorder,inorder,0,inorder.length - 1);
}
private TreeNode buildTreeChild(int[] preorder, int[] inorder, int inbegin, int inend){
if(inbegin > inend){
return null;
}
//递归结束的条件 如果左边界大于有边界 此时说明这个节点不存在 直接返回null
TreeNode root = new TreeNode(preorder[preIndex]);
//定义根节点
int rootIndex = findIndex(inorder, inbegin, inend, preorder[preIndex]);
//在中序遍历中找到根节点对应的下标 写一个方法完成这个步骤
preIndex++;
//每定义一个根节点 根节点下标位置+1;
root.left = buildTreeChild( preorder, inorder, inbegin, rootIndex - 1);
//递归构建左树
root.right = buildTreeChild( preorder, inorder, rootIndex + 1, inend);
//递归构建右树
return root;
//返回根节点
}
private int findIndex(int[] inorder, int inbegin, int inend, int k){
//在一个范围内查找指定值的下标
for(int i = inbegin; i <= inend; i++){
if(inorder[i] == k){
return i;
}
}
return -1;
}
}