剑指OfferII054.所有大于等于节点的值之和

题目

给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。

提醒一下,二叉搜索树满足下列约束条件:

节点的左子树仅包含键 小于 节点键的节点。

节点的右子树仅包含键 大于 节点键的节点。

左右子树也必须是二叉搜索树。

示例 1:输入:root = [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]

输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

示例 2:输入:root = [0,null,1] 输出:[1,null,1]

示例 3:输入:root = [1,0,2] 输出:[3,3,2]

示例 4:输入:root = [3,2,4,1] 输出:[7,9,4,10]

提示:树中的节点数介于 0 和 104 之间。

每个节点的值介于 -104 和 104 之间。

树中的所有值 互不相同 。

给定的树为二叉搜索树。

注意:本题与主站 538 题相同:

本题与主站 1038 题相同:

解题思路分析

1、递归;时间复杂度O(n),空间复杂度O(log(n))

剑指OfferII054.所有大于等于节点的值之和

func convertBST(root *TreeNode) *TreeNode {
   sum := 0
   dfs(root, &sum)
   return root
}

func dfs(root *TreeNode, sum *int) {
   if root == nil {
      return
   }
   dfs(root.Right, sum)
   *sum = *sum + root.Val
   root.Val = *sum
   dfs(root.Left, sum)
}

2、栈辅助;时间复杂度O(n),空间复杂度O(n)

func convertBST(root *TreeNode) *TreeNode {
   if root == nil {
      return root
   }
   stack := make([]*TreeNode, 0)
   temp := root
   sum := 0
   for {
      if temp != nil {
         stack = append(stack, temp)
         temp = temp.Right
      } else if len(stack) != 0 {
         temp = stack[len(stack)-1]
         stack = stack[:len(stack)-1]
         temp.Val = temp.Val + sum
         sum = temp.Val
         temp = temp.Left
      } else {
         break
      }
   }
   return root
}

总结

Medium题目,题目同leetcode 538.把二叉搜索树转换为累加树、leetcode 1038.把二叉搜索树转换为累加树

展开阅读全文

页面更新:2024-03-10

标签:之和   子树   节点   递归   本题   复杂度   示例   题目   思路   提示   条件   时间   科技   空间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top