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
}
浙公网安备 33010602011771号