算法训练营day33(补),复习二叉树1

// 889. 根据前序和后序遍历构造二叉树

//   前序中左右 后序遍历左右中

func constructFromPrePost(preorder []int, postorder []int) *TreeNode {

  if len(preorder) == 0 {

    return nil

  }

  root := &TreeNode{}

  root.Val = preorder[0]

  //前序数组去掉root节点

  preorder = preorder[1:]

  //后序数组去掉root节点

  postorder = postorder[:len(postorder)-1]

  //如果前序数组只剩1个,说明只有左子树或者右子树

  if len(postorder) == 1 {

    root.Left = &TreeNode{Val: postorder[0]}

    return root

  }

  index := 0

  for ; index < len(postorder); index++ {

    if postorder[index] == preorder[0] {

      break

    }

  }

  if len(postorder) > 1 {

    leftPostorder := postorder[:index+1]

    rightPostorder := postorder[index+1:]

    leftPreorder := preorder[:index+1]

    rightPreorder := preorder[index+1:]

    root.Left = constructFromPrePost(leftPreorder, leftPostorder)

    root.Right = constructFromPrePost(rightPreorder, rightPostorder)

  }

  return root

}

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值