往完全二叉树添加节点——二进制表示

204 阅读1分钟

image.png

我们将完全二叉树的节点用二进制表示,根节点就是 1, 它左节点就是 10, 它的左节点是 11, 它的左节点的左节点就是 100, 右节点是 101, 右节点的左节点 110, 依此类推,我们只需要记录当前的节点数,然后插入新节点时,自然新节点的位置就是 节点数加1 然后转二进制表示,从而按照二进制的 0, 1,来判断往右还是往左即可

核心代码:

for i := bits.Len(uint(c.cnt)) - 2; i > 0; i-- {
        if c.cnt>>i&1 == 0 {
            node = node.Left
        } else {
            node = node.Right
        }
    }

其中 c.cnt>>i&1 == 0,正是我们用来判断从左往右开始二进制位的值是 0 还是 1,当然 i > 0, 自然是因为我们不能之间判断最后一个值,因为我们需要当前的 node, 所以最后一个值的判断逻辑我们移除来单独判断

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

type CBTInserter struct {
    root *TreeNode
    cnt  int
}

func Constructor(root *TreeNode) CBTInserter {
    q := []*TreeNode{root}
    cnt := 0
    for len(q) > 0 {
        cnt++
        node := q[0]
        q = q[1:]
        if node.Left != nil {
            q = append(q, node.Left)
        }
        if node.Right != nil {
            q = append(q, node.Right)
        }
    }
    return CBTInserter{root, cnt}
}

func (c *CBTInserter) Insert(val int) int {
    c.cnt++
    child := &TreeNode{Val: val}
    node := c.root
    for i := bits.Len(uint(c.cnt)) - 2; i > 0; i-- {
        if c.cnt>>i&1 == 0 {
            node = node.Left
        } else {
            node = node.Right
        }
    }
    if c.cnt&1 == 0 {
        node.Left = child
    } else {
        node.Right = child
    }
    return node.Val
}

func (c *CBTInserter) Get_root() *TreeNode {
    return c.root
}