我们将完全二叉树的节点用二进制表示,根节点就是 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
}