2641. 二叉树的堂兄弟节点 II

55 阅读1分钟

2641. 二叉树的堂兄弟节点 II

相关知识点:二叉树、广度优先搜索

  • 我的思路:利用广搜找到这一层的所有节点的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
}