Files
LeetCode-Go/leetcode/1104.Path-In-Zigzag-Labelled-Binary-Tree/1104.Path In Zigzag Labelled Binary Tree.go
2021-07-29 11:58:29 +08:00

44 lines
773 B
Go

package leetcode
func pathInZigZagTree(label int) []int {
level := getLevel(label)
ans := []int{label}
curIndex := label - (1 << level)
parent := 0
for level >= 1 {
parent, curIndex = getParent(curIndex, level)
ans = append(ans, parent)
level--
}
ans = reverse(ans)
return ans
}
func getLevel(label int) int {
level := 0
nums := 0
for {
nums += 1 << level
if nums >= label {
return level
}
level++
}
}
func getParent(index int, level int) (parent int, parentIndex int) {
parentIndex = 1<<(level-1) - 1 + (index/2)*(-1)
parent = 1<<(level-1) + parentIndex
return
}
func reverse(nums []int) []int {
left, right := 0, len(nums)-1
for left < right {
nums[left], nums[right] = nums[right], nums[left]
left++
right--
}
return nums
}