这个题可以说很常见了,在纸上写还好,问题是怎么写成代码的形式。
首先,构建一个二叉树,可以通过先序遍历来完成,那么代码的框架就是先序遍历。在preorder数组中,每个元素都可以把inorder数组中的数分成左右两个部分,那肯定就是递归构造左子树和右子树了。
可以用map来保存中序数组中元素的索引,再加一些参数用于处理就行。
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
Map inMap = new HashMap<>();
//存一个中序的索引
for(int i=0;i inMap){
if(preStart > preEnd || inStart > inEnd){
return null;
}
//先new一个根节点
TreeNode root = new TreeNode(preorder[preStart]);
int inRoot = inMap.get(root.val);
int leftNum = inRoot - inStart;
//左
root.left = build(preorder, preStart+1, preStart+leftNum, inorder, inStart, inRoot-1, inMap);
//右
root.right = build(preorder, preStart+1+leftNum, preEnd, inorder, inRoot+1, inEnd, inMap);
return root;
}
}



