题目要求:
分析:
只要是碰到树的题目,十有八九都会利用递归,这道题页不例外。
前序遍历的顺序为:根 -> 左 -> 右
中序遍历的顺序为:左 -> 根 -> 右
由上述遍历顺序我们可知,preorder[0]的值是整棵树的root,那么我们接下来所要做的事情就是遍历inorder数组,找到与root的值相等的那个值,将其坐标记为index。此时:
index的左边为整棵树的左子树;
index的右边为整棵树的右子树。
接下来就分别对左子树和右子树进行遍历,因为它们的过程与找到整棵树的根和整棵树的左右子树都是一样的,只是范围小了一点而已(分治法)。
具体代码如下:
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder == null || inorder == null)
return null;
return build(preorder, inorder, 0, 0, inorder.length - 1);
}
private TreeNode build(int[] preorder, int[] inorder, int preStart, int inStart, int inEnd) {
if(preStart > preorder.length - 1 || inStart > inEnd)
return null;
TreeNode root = new TreeNode(preorder[preStart]);
int index = 0;
for(int i = inStart; i <= inEnd; i ++) {
if(inorder[i] == root.val) {
index = i;
break;
}
}
root.left = build(preorder, inorder, preStart + 1, inStart, index - 1);
root.right = build(preorder, inorder, preStart + index - inStart + 1, index + 1, inEnd);
return root;
}
}
上述代码中要注意的有两点:
- 要先进行边界范围的判断;
- prestart的范围的求法: