【二叉树】有序链表转换二叉搜索树

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
}


小编辑器

请添加图片描述


猜你喜欢

转载自blog.csdn.net/xjh093/article/details/122960714
今日推荐