tema 0x00
Dada una 单
lista enlazada
cuyos elementos están 升序
ordenados
, conviértala en un 二叉搜索
árbol
Un 高度平衡
árbol binario significa que el valor absoluto
de los 左右
dos
高度差
no excede1
0x01 Ideas
Este problema es similar a convertir una matriz ordenada en un árbol de búsqueda binaria
La característica de la primera 链表
conversión 数组
二叉搜索树
es:
si [recorrido en orden] árbol de búsqueda binaria, el resultado es una 升序
matriz
El [número medio] de una matriz ordenada 根节点
左
es la secuencia de 左子树
右
aristas es la secuencia del nodo raíz La 右子树
secuencia así sucesivamente Por lo tanto, la [dicotomía] se puede utilizar para resolver el problema
solución 0x02
idioma:Swift
nodo de árbol: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
}
}
solución:
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
}