leetcode之108将有序数组转化为二叉搜索树Golang

题目描述

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

     0
    / \
  -3   9
  /   /
-10  5

算法

采用递归的方式,每次取数组的中间数据,作为当前子树的根节点,然后在数组中剩余的左半部分划分到左子树,右半部分划分到右子树

循环上述过程,就得到了一颗平衡二叉搜索树。

代码如下

func sortedArrayToBST(nums []int) *TreeNode {
    length := len(nums)
    // 数组为空,直接就返回空的二叉树
    if length == 0 {
        return nil
    }
    // 数组不为空,那么至少有一个结点,就是跟结点
    // 这里先创建结点,再将结点的指针传入递归函数的原因是避免值传递
    // 如果在递归函数里面创建结点,申请结点的内存,那么递归函数的入口参数就是采用的值传递,
    // 例如如果传入的指针的值是nil,并且在递归函数内部将创建的结点的引用赋值给这个指针,那么因为是值传递,所以在函数结束以后,传入的指针的值还是nil。
    res := &TreeNode{}
    low, high := 0, length-1
    var tranFunc func(low, high int, midNode *TreeNode)
    tranFunc = func(low, high int, midNode *TreeNode) {
        // 找到数组中间位置,并将数组中间位置的数据赋值到已经创建好的结点上
        mid := (low + high) / 2
        midNode.Val = nums[mid]
        // 如果中间的左半部分还有数据,那么创建左子树的根结点,并且调用递归函数
        if low <= mid-1 {
            midNode.Left = &TreeNode{}
            tranFunc(low, mid-1, midNode.Left)
        }
        // 如果中间的右半部分还有数据,那么创建右子树的根结点,并且调用递归函数
        if mid+1 <= high {
            midNode.Right = &TreeNode{}
            tranFunc(mid+1, high, midNode.Right)
        }
    }
    tranFunc(low, high, res)
    return res
}

  

 

posted @ 2020-10-13 00:37  胖胖咩  阅读(305)  评论(0)    收藏  举报