Go语言实现中序遍历和后序遍历构建二叉树

思路:1. 从后序遍历的数组中找出最后一个值,2. 在中序遍历的数组中找到该值的下标,把中序数组分割成两部分(分割点为找到的下标,两部分是除了分割点之外的左右两部分),3.再把后序遍历的数组分割成左右两部分,分割点的下标为2步骤找到的下标,左部分不包含分割点,右部分包含分割点。分割成的左右两部分为左右子二叉树。4.重复1、2、3步骤,直到确定二叉树。

如:

中序遍历 inorder = [9,3,15,20,7],后序遍历 postorder = [9,15,7,20,3]

第一次分割: inorder = [9,3,15,20,7] , 分割点的下标为1.

postorder = [9,15,7,20,3] => 3的左子树:postorder1 = [9] ,3的右子树:postorder2 = [15,7,20]

第二次分割: inorder1 = [9] , 只有一个元素,不再分割.

                      postorder1 = [9]

第三次分割: inorder = [15,20,7] , 分割点的下标为1.

postorder = [15,7,20] => 左子树:20的postorder3 = [15] ,20的右子树:postorder4 = [7]

结果:

func buildTree(inorder []int, postorder []int) *TreeNode {
    //判断是否为空节点
    if len(inorder) < 1 && len(postorder) < 1{
        return nil
    }
    //如果不为空,那么取后序数组最后一个元素作为节点元素。
    node := postorder[len(postorder) - 1]
    //找到后序数组最后一个元素在中序数组的位置,作为切割点
    index := find(inorder,node)
    root := &TreeNode{
        Val:node,
        Left:buildTree(inorder[:index],postorder[:index]),
        Right:buildTree(inorder[index+1:],postorder[index:len(postorder) - 1]),
    }
    return root
}

//找到后序数组最后一个元素在中序数组的下标
func find(inorder []int,node int) int{
    for i,v := range inorder{
        if v == node{
            return i
        }
    }
    return -1
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值