0x00 题目

给定一个 ​​单​​​ 链表
其中的元素按 ​​​升序​​​ 排序
将其转换为高度平衡的 ​​​二叉搜索​​ 树

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


0x01 思路

这道题目跟 ​​有序数组转换为二叉搜索树​​ 类似

先把 ​​链表​​​ 转换成 ​​数组​​​​二叉搜索树​​ 的特征是:
如果【中序遍历】二叉搜索树,则结果为一个 ​​升序​​ 数组

有序数组的【中间数】即为 ​​根节点​​​​左​​ 边的序列为根节点的​​左子树​​​​右​​ 边的序列为根节点的 ​​右子树​​ 依次类推,因此,可以采用【二分法】来解题


0x02 解法

语言:​​Swift​

树节点:​​TreeNode​

public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}

解法:

func sortedListToBST(_ head: ListNode?) -> TreeNode? {
if head == nil { return nil }

// 将 链表 转换成 数组
var tmp = head
var arr: [Int] = []
while tmp != nil {
arr.append(tmp!.val)
tmp = tmp?.next
}

// 有序数组 转换为 二叉搜索树
return toBST(arr, 0, arr.count - 1)
}

func toBST(_ nums: [Int], _ left: Int, _ right: Int) -> TreeNode? {
if left > right { return nil }
let mid = (left + right) / 2
let val = nums[mid]

// 根节点
let node = TreeNode(val)

// 左子树
node.left = toBST(nums, left, mid - 1)

// 右子树
node.right = toBST(nums, mid + 1, right)

return node
}

小编辑器