【二叉树】有序链表转换二叉搜索树
原创
©著作权归作者所有:来自51CTO博客作者haocold的原创作品,请联系作者获取转载授权,否则将追究法律责任
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
}
小编辑器