T105 根据先序和中序序列构建二叉树

思想:借助分治思想,时间复杂度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){//这里后
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值