通过前、中、后序,任意两种结果来构建二叉树

    前序 和 中序 构建二叉树

    1. /**
    2. * Definition for a binary tree node.
    3. * type TreeNode struct {
    4. * Val int
    5. * Left *TreeNode
    6. * Right *TreeNode
    7. * }
    8. */
    9. func buildTree(preorder []int, inorder []int) *TreeNode {
    10. if len(preorder) == 0 {
    11. return nil
    12. }
    13. rootVal := preorder[0]
    14. i := 0
    15. // 查找根节点位置
    16. for ; i < len(inorder); i++ {
    17. if rootVal == inorder[i] {
    18. break
    19. }
    20. }
    21. root := &TreeNode{Val: rootVal}
    22. root.Left = buildTree(preorder[1:i+1], inorder[:i])
    23. root.Right = buildTree(preorder[i+1:], inorder[i+1:])
    24. return root
    25. }
    26. func buildTree(preorder []int, inorder []int) *TreeNode {
    27. if len(preorder) == 0 || len(inorder) == 0 {
    28. return nil
    29. }
    30. tree := make(map[int]int)
    31. for k,v := range inorder {
    32. tree[v] = k
    33. }
    34. return build(preorder,inorder,0,len(preorder)-1,0,len(inorder)-1,tree)
    35. }
    36. func build(preorder,inorder []int, p_start,p_end,i_start,i_end int , tree map[int]int) *TreeNode {
    37. if p_start > p_end {
    38. return nil
    39. }
    40. root := &TreeNode{Val:preorder[p_start]}
    41. index,_ := tree[preorder[p_start]]
    42. preLeftTreeRight := index + p_start - i_start
    43. root.Left = build(preorder,inorder,p_start+1,preLeftTreeRight,i_start,index-1,tree)
    44. root.Right = build(preorder,inorder,preLeftTreeRight+1,p_end,index+1,i_end,tree)
    45. return root
    46. }

    中序 和 后序 构建二叉树

    /**
     * Definition for a binary tree node.
     * type TreeNode struct {
     *     Val int
     *     Left *TreeNode
     *     Right *TreeNode
     * }
     */
    
    // 来看一下一共分几步:
    
    // 第一步:如果数组大小为零的话,说明是空节点了。
    
    // 第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。
    
    // 第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点
    
    // 第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)
    
    // 第五步:切割后序数组,切成后序左数组和后序右数组
    
    // 第六步:递归处理左区间和右区间
    
    
    func buildTree(inorder []int, postorder []int) *TreeNode {
        if (len(inorder) ==0 || len(postorder)==0) || (len(inorder) != len(postorder)) {
            return nil 
        }
        root := &TreeNode{Val: postorder[len(postorder)-1]} 
    
        index := 0 
        for k,v := range inorder{
            if v == postorder[len(postorder)-1] {
                index = k 
            }
        }
    
        left := postorder[:index]  // postorder[:index] inorder[:index] 
        right := postorder[index:len(postorder)-1]  // postorder[index:len(postorder)-1] inorder[index+1:]
    
        if len(left) > 1 {
            root.Left = buildTree(inorder[:index],postorder[:index])
        } else if len(left) == 1  {
            root.Left = &TreeNode{Val: left[len(left)-1]}
        }
    
        if len(right) > 1 {
            root.Right = buildTree(inorder[index+1:],postorder[index:len(postorder)-1])
        } else if len(right) == 1  {
            root.Right = &TreeNode{Val: right[len(right)-1]}
        }
    
        return root 
    }
    


    前序 和 后序 构建二叉树**

    /**
     * Definition for a binary tree node.
     * type TreeNode struct {
     *     Val int
     *     Left *TreeNode
     *     Right *TreeNode
     * }
     */
    
    func buildTree(pre []int,post []int ) *TreeNode  {
        N := len(pre)
        if N == 0 {
            return nil
        }
        root := &TreeNode{Val: pre[0]}
        if N == 1 {
            return root
        }
        L := 0
        for i:=0;i<N;i++ {
            if post[i] == pre[1] {
                L = i+1
                break
            }
        }
        root.Left = inorder(pre[1:L+1],post[0:L])
        root.Right = inorder(pre[L+1:N],post[L:N-1])
        return root
    }