思想:借助分治思想,时间复杂度O(NlogN),空间复杂度为O(logN)
时间复杂度计算利用Master定理:
T(n) = 2T(n/2)+ n
借助先序序列构建当前根结点root,然后再借助中序序列去求root的左和右孩子在先序序列中的位置,这也是这题得到巧妙之处
怎么求?
1、这里根据先序序列的特性,其左孩子必为先序序列中根节点的下一个位置上的结点
2、那么右孩子呢?可以这么考虑:先序序列遍历顺序为:根->左->右,那你要早右孩子在先序序列中的位置,可以先求出根结点的左子树右多少个结点,假设有m个.然后右孩子对应的下标即为当前根结点在先序序列中的下标+m.(prestart+rootidx-inStart+1)
那么怎么求这个m呢?借助中序遍历的特性:左->根->右,所以只要找出根结点在中序序列中的下标然后减去中序序列的起始下标+1即为其左子树有多少个结点(m=rootidx-inStart+1)
class Solution {
/*
@attribute int istart(iend):初始值应为原中序序列的首尾下标,然后进行迭代后,其值分别表示root的左(右)子树在中序序列中的起始位置
@attribute int pStart:代表待创建的根节点在先序序列中的下标
*/
public TreeNode bulider(int[]preorder,int pstart,int[]inorder,int istart,int iend){
if(pstart>=preorder.length||istart>iend){//这里后