力扣打卡:剑指 Offer 07. 重建二叉树
解题思路
熟悉前中后序遍历的顺序,记录的顺序
- 前序遍历 中左右
- 中序遍历 左中右
- 后序遍历 左右中
代码
/**
* 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) {
return build(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
}
// 对于前序遍历来说,从顺序开始,每一个元素都是父节点,左边一部分元素就是左子树,右边的一部分就是右子树
public TreeNode build(int[] preorder, int preStart, int preEnd,
int[] inorder, int inStart, int inEnd){
// basecase 最后来写
if(preStart>preEnd) return null;
// 首先需要前序遍历数组,同时知道前序遍历的数组的开始和结束,因为从遍历开始到结束,做一个树
// 其次需要中序遍历数组,同时知道中序遍历的数组的开始和结束
// 所以首先确定了参数需要有前序中序的数组,开始和结束的位置
// 首先构造根节点
int rootVal = preorder[preStart];
TreeNode root = new TreeNode(rootVal);
// 寻找中序数组中,root所在的位置
int point = 0;
for(int i=inStart; i<=inEnd; i++){
if(inorder[i]==rootVal){
point = i;
break;
}
}
int leftSize = point-inStart; // 中序数组中,找到左子树的范围,因为去掉父节点,所以这是真实的长度
int rightSize= inEnd-point; // 中序数组中,找到右子树的范围,因为去掉父节点,所以这是真实的长度
// 构建子树
root.left = build(preorder,preStart+1,preStart+leftSize,inorder,inStart,point-1);
root.right= build(preorder,preStart+leftSize+1,preEnd,inorder,point+1,inEnd);
return root;
}
}