完全二叉树的节点个数——二分

70 阅读1分钟

image.png

代码 二分:

  1. 通过判断 bits&k 的结果得到每一层是向右还是向左
  2. 然后bits >>= 1 去判断下一层的方向
  3. 直到 bit == 0 或 node == nil, 也就是到达最后一层,也就是我们现在判断的位置
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func countNodes(root *TreeNode) int {
    if root == nil {
        return 0
    }
    level := 0
    for node := root; node.Left != nil; node = node.Left {
        level++
    }
    return sort.Search(1<<(level+1), func(k int) bool {
        if k <= 1<<level {
            return false
        }
        bits := 1 << (level - 1)
        node := root
        for node != nil && bits > 0 {
            if bits&k == 0 {
                node = node.Left
            } else {
                node = node.Right
            }
            bits >>= 1
        }
        return node == nil
    }) - 1
}