1
0
Fork 0
mirror of https://gitlab.com/mfocko/LeetCode.git synced 2024-11-09 15:59:06 +01:00
LeetCode/go/balance-a-binary-search-tree.go

70 lines
1.1 KiB
Go
Raw Normal View History

package main
func balanceBST(root *TreeNode) *TreeNode {
biggestPowerOfTwoThan := func(n int) int {
x := 1
for x <= n {
x <<= 1
}
return x >> 1
}
rotateLeft := func(parent, node *TreeNode) {
tmp := node.Right
node.Right = tmp.Left
tmp.Left = node
parent.Right = tmp
}
rotateRight := func(parent, node *TreeNode) {
tmp := node.Left
node.Left = tmp.Right
tmp.Right = node
parent.Right = tmp
}
rotate := func(head *TreeNode, count int) {
current := head
for i := 0; i < count; i++ {
tmp := current.Right
rotateLeft(current, tmp)
current = current.Right
}
}
if root == nil {
return nil
}
// Step 1 of DSW
head := TreeNode{Val: 0}
head.Right = root
current := &head
for current.Right != nil {
if current.Right.Left != nil {
rotateRight(current, current.Right)
} else {
current = current.Right
}
}
// Step 2 of DSW
count, current := 0, head.Right
for current != nil {
count++
current = current.Right
}
// Step 3 of DSW
m := biggestPowerOfTwoThan(count+1) - 1
rotate(&head, count-m)
for m > 1 {
m >>= 1
rotate(&head, m)
}
return head.Right
}