【Árbol binario】Árbol de búsqueda binaria de conversión de lista enlazada ordenada

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
}


pequeño editor

Por favor agregue la descripción de la imagen


Supongo que te gusta

Origin blog.csdn.net/xjh093/article/details/122960714
Recomendado
Clasificación