golang leetcode 1103. 二叉树寻路

Tibbersshao · · 606 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

思路: 通过当前label计算父节点

题目限制 1 <= label <= 10^6
完全二叉树每一层的节点和节点开始数字为:
1
2
4
8
16
32
...
所以每一层的数为 []int{1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576}

  1. 提前计算每一层的数量。
  2. 遍历找到当前lablel所在的层。当前层最后一个节点为 last - 1。因为这个二叉树是蛇形走位。所以 上层节点所在对应层的偏移是 (last - 1 - label)/2
  3. 计算上一层的起始位置为last/4。
  4. 上一层label即为 (last - 1 - label)/2 + last/4。
  5. 递归知道label = 1
var start = []int{1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576}

func pathInZigZagTree(label int) []int {
    if label == 1 {
        return []int{1}
    }
    last := 0
    for i := 0; i < len(start); i++ {
        if label < start[i] {
            last = start[i]
            break
        }
    }
    idx := (last - label - 1) / 2
    return append(pathInZigZagTree(last/4+idx), label)
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:Tibbersshao

查看原文:golang leetcode 1103. 二叉树寻路

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

606 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传