相关知识点:二叉树、广度优先搜索
- 我的思路:利用广搜找到这一层的所有节点的sum,然后再减去同一个父节点的子节点的和。问题关键点在于层级遍历和减去父节点的子节点和
- 我的代码
func replaceValueInTree(root *TreeNode) *TreeNode {
if root == nil{
return root
}
deepNum := make([][]int, 0, 20)
deepNum = append(deepNum, []int{0})
tree := []*TreeNode{root}
deep := []int{0}
// 第一次遍历找到所有层级的和
for len(tree) > 0 {
node := tree[0]
tree = tree[1:]
index := deep[0]
deep = deep[1:]
ans := 0
if node.Left != nil {
tree = append(tree, node.Left)
deep = append(deep, index+1)
// fmt.Println(index+1, len(deepNum))
if len(deepNum) <= index+1 {
deepNum = append(deepNum, []int{})
}
ans += node.Left.Val
}
if node.Right != nil {
tree = append(tree, node.Right)
deep = append(deep, index+1)
// fmt.Println(index+1, len(deepNum))
if len(deepNum) <= index+1 {
deepNum = append(deepNum, []int{})
}
ans += node.Right.Val
}
if len(deepNum) <= index+1 {
deepNum = append(deepNum, []int{})
}
deepNum[index+1] = append(deepNum[index+1], ans)
}
// fmt.Println("rew")
deepSum := make([]int, 0, len(deepNum))
for _, v := range deepNum {
sum := 0
for _, num := range v {
sum += num
}
deepSum = append(deepSum, sum)
}
root.Val = 0
tree = []*TreeNode{root}
deep = []int{0}
// 第二次,减去同一父节点和的值
for len(tree) > 0 {
node := tree[0]
tree = tree[1:]
index := deep[0]
deep = deep[1:]
sum := 0
if len(deepSum) > index+1 {
sum = deepSum[index+1]
}
otherNode := 0
if node.Left != nil {
tree = append(tree, node.Left)
deep = append(deep, index+1)
if len(deepNum) >= index+1 {
deepNum = append(deepNum, []int{})
}
otherNode += node.Left.Val
}
if node.Right != nil {
tree = append(tree, node.Right)
deep = append(deep, index+1)
if len(deepNum) >= index+1 {
deepNum = append(deepNum, []int{})
}
otherNode += node.Right.Val
}
sum -= otherNode
if node.Left != nil {
node.Left.Val = sum
}
if node.Right != nil {
node.Right.Val = sum
}
}
return root
}
- 当然也可以优化,把两步放在一个循环中
func replaceValueInTree(root *TreeNode) *TreeNode {
q := []*TreeNode{root}
root.Val = 0
for len(q) > 0 {
var q2 []*TreeNode
sum := 0
for _, fa := range q {
if fa.Left != nil {
q2 = append(q2, fa.Left)
sum += fa.Left.Val
}
if fa.Right != nil {
q2 = append(q2, fa.Right)
sum += fa.Right.Val
}
}
for _, fa := range q {
childSum := 0
if fa.Left != nil {
childSum += fa.Left.Val
}
if fa.Right != nil {
childSum += fa.Right.Val
}
if fa.Left != nil {
fa.Left.Val = sum - childSum
}
if fa.Right != nil {
fa.Right.Val = sum - childSum
}
}
q = q2
}
return root
}