[Day34]-[二叉树] 有序链表转换二叉搜索树
作者:方勇(gopher)
- 2022 年 5 月 03 日
本文字数:1183 字
阅读完需:约 4 分钟
109. 有序链表转换二叉搜索树
给定一个单链表的头节点 head
,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。
示例 1:
输入: head = [-10,-3,0,5,9]
输出: [0,-3,9,-10,null,5]
解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。
复制代码
示例 2:
输入: head = []
输出: []
复制代码
题解:
func TestSortedListToBST(t *testing.T) {
var head *ListNode
for i := 9; i >= 0; i-- {
curr := &ListNode{
Val: i,
}
curr.Next = head
head = curr
} // 前插法 构建链表
// 题解:
// 有序链表 和 有序数组一样,构建BST的时候,采用分治的方式
// 每次构建树,需要找到中间件的位置,才能高度平衡
var getMid func(left, right *ListNode) *ListNode // 获取中间节点
var buildTree func(left, right *ListNode) *TreeNode // 构建树
getMid = func(left, right *ListNode) *ListNode { // 采用快慢指针查找链表的中间件元素
fast, slow := left, left
for fast != right && fast.Next != right { // 这里注意查找的结束边界为右指针
slow = slow.Next
fast = fast.Next.Next
}
return slow
}
buildTree = func(left, right *ListNode) *TreeNode { // 分治
if left == right {
return nil
}
mid := getMid(left, right)
tree := &TreeNode{Val: mid.Val}
tree.Left = buildTree(left, mid)
tree.Right = buildTree(mid.Next, right) // 这里注意是mid.Next
return tree
}
tree := buildTree(head, nil)
t.Log(tree)
}
复制代码
题解
func TestSortedListToBST2(t *testing.T) {
var head *ListNode
for i := 9; i >= 0; i-- {
curr := &ListNode{
Val: i,
}
curr.Next = head
head = curr
}
// 题解:
// 上面耗时 主要在寻找链表的中间位置,BST中序遍历其实就是一个升序链表
// 可采用分治 + LDR的方式 构建树
var getLength func(head *ListNode) int // 获取链表的长度
var buildTree func(left, right int) *TreeNode // 构建树
getLength = func(head *ListNode) int {
n := 0
for ; head != nil; head = head.Next {
n++
}
return n
}
buildTree = func(left, right int) *TreeNode {
if left > right { // 注意不是>=,如果=的时候退出,mid就不会执行到了
return nil
}
mid := (left + right) >> 1 // 奇数的时候刚好是中的,偶数的时候是中间位置的前面一个
tree := &TreeNode{}
tree.Left = buildTree(left, mid-1) // mid-1
tree.Val = head.Val
head = head.Next
tree.Right = buildTree(mid+1, right) // mid+1
return tree
}
tree := buildTree(0, getLength(head)-1)
t.Log(tree)
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 7
方勇(gopher)
关注
Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入
我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!
评论