📑 题目:109. 有序链表转换二叉搜索树

🚀 本题 LeetCode 传送门

题目大意

将链表转化为高度平衡的二叉搜索树。高度平衡的定义:每个结点的 2 个子结点的深度不能相差超过 1 。

解题思路

思路比较简单,依次把链表的中间点作为根结点,类似二分的思想,递归排列所有结点即可。

代码

  1. package leetcode
  2. /**
  3. * Definition for singly-linked list.
  4. * type ListNode struct {
  5. * Val int
  6. * Next *ListNode
  7. * }
  8. */
  9. /**
  10. * Definition for a binary tree node.
  11. * type TreeNode struct {
  12. * Val int
  13. * Left *TreeNode
  14. * Right *TreeNode
  15. * }
  16. */
  17. // TreeNode define
  18. type TreeNode struct {
  19. Val int
  20. Left *TreeNode
  21. Right *TreeNode
  22. }
  23. func sortedListToBST(head *ListNode) *TreeNode {
  24. if head == nil {
  25. return nil
  26. }
  27. if head != nil && head.Next == nil {
  28. return &TreeNode{Val: head.Val, Left: nil, Right: nil}
  29. }
  30. middleNode, preNode := middleNodeAndPreNode(head)
  31. if middleNode == nil {
  32. return nil
  33. }
  34. if preNode != nil {
  35. preNode.Next = nil
  36. }
  37. if middleNode == head {
  38. head = nil
  39. }
  40. return &TreeNode{Val: middleNode.Val, Left: sortedListToBST(head), Right: sortedListToBST(middleNode.Next)}
  41. }
  42. func middleNodeAndPreNode(head *ListNode) (middle *ListNode, pre *ListNode) {
  43. if head == nil || head.Next == nil {
  44. return nil, head
  45. }
  46. p1 := head
  47. p2 := head
  48. for p2.Next != nil && p2.Next.Next != nil {
  49. pre = p1
  50. p1 = p1.Next
  51. p2 = p2.Next.Next
  52. }
  53. return p1, pre
  54. }