从中序与后序遍历序列构造二叉树
//106. 从中序与后序遍历序列构造二叉树
func buildTree(inorder []int, postorder []int) *TreeNode {
  if len(inorder)==0 || len(postorder)==0{
    return nil
  }
  ptL:=len(postorder)
  val:=postorder[ptL-1]
  index:=findInOrderIndex(inorder,val)
  fmt.Printf("index:%d,val:%d,inorder:%v,postorder:%v\n",index,val,inorder,postorder)
  root:=TreeNode{
    val,buildTree(inorder[:index],postorder[:index]),//重点:postorder[:index]的原因是:要确保中序和后序数组的长度一致
    buildTree(inorder[index+1:],postorder[index:ptL-1]),
  }
  return &root
}
func findInOrderIndex(inorder []int,val int) int  {
  for i,v := range inorder {
    if v==val{
      return  i
    }
  }
  return -1
}最大二叉树
//654. 最大二叉树
func constructMaximumBinaryTree(nums []int) *TreeNode {
  if len(nums)<1{
    return nil
  }
  index:=findNumxMax(nums)
  root:=TreeNode{nums[index],
    constructMaximumBinaryTree(nums[:index]),
      constructMaximumBinaryTree(nums[index+1:])}
  return &root
}
func findNumxMax(inorder []int) (index int)  {
  for i := 1; i < len(inorder); i++ {
    if inorder[i]>inorder[index]{
      index=i
    }
  }
  return index
}合并二叉树
//617. 合并二叉树
func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
  if root1==nil{
    return root2
  }
  if root2==nil{
    return root1
  }
  root1.Val+=root2.Val
  root1.Left=mergeTrees(root1.Left,root2.Left)
  root1.Right=mergeTrees(root1.Right,root2.Right)
  return root1
}
//617. 合并二叉树
func mergeTreesV1(root1 *TreeNode, root2 *TreeNode) *TreeNode {
  if root1==nil{
    return root2
  }
  if root2==nil{
    return root1
  }
  lt1:=list.New()
  lt1.PushBack(root1)
  lt2:=list.New()
  lt2.PushBack(root2)
  for lt1.Len()>0 || lt2.Len()>0{
    node1:=lt1.Remove(lt1.Back()).(*TreeNode)
    node2:=lt2.Remove(lt2.Back()).(*TreeNode)
    node1.Val+=node2.Val
    if node1.Left!=nil && node2.Left!=nil{
      lt1.PushBack(node1.Left)
      lt2.PushBack(node2.Left)
    }
    if node1.Right!=nil && node2.Right!=nil{
      lt1.PushBack(node1.Right)
      lt2.PushBack(node2.Right)
    }
    if node1.Right==nil{
      node1.Right=node2.Right
    }
    if node1.Left==nil{
      node1.Left=node2.Left
    }
  }
  return root1
}二叉搜索树中的搜索
//700. 二叉搜索树中的搜索
func searchBST(root *TreeNode, val int) *TreeNode {
  if root==nil{
    return nil
  }
  if root.Val==val{
    return root
  }
  if root.Right!=nil{
    node:=searchBST(root.Right,val)
    if node!=nil{
      return node
    }
  }
  if root.Left!=nil{
    node:=searchBST(root.Left,val)
    if node!=nil{
      return node
    }
  }
  return nil
}
//700. 二叉搜索树中的搜索
//二叉搜索树是一个有序树:
//若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
//若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
//它的左、右子树也分别为二叉搜索树
func searchBSTV1(root *TreeNode, val int) *TreeNode {
  if root==nil || root.Val==val{
    return root
  }
  if root.Val>val{//左
    return searchBST(root.Left,val)
  }
  return searchBST(root.Right,val)
}
//700. 二叉搜索树中的搜索
func searchBSTV2(root *TreeNode, val int) *TreeNode {
  for root!=nil {
    if  root.Val==val{
      return root
    }
    if root.Val>val { //左
      root=root.Left
    }else{
      root=root.Right
    }
  }
  return nil
}                










