「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战」
538. 把二叉搜索树转换为累加树
题目描述
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node
的新值等于原树中大于或等于 node.val
的值之和。
提醒一下,二叉搜索树满足下列约束条件:
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
注意: 本题和 1038: leetcode-cn.com/problems/bi… 相同
示例 1:
1 | csharp复制代码输入: [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8] |
示例 2:
1 | ini复制代码输入: root = [0,null,1] |
示例 3:
1 | ini复制代码输入: root = [1,0,2] |
示例 4:
1 | ini复制代码输入: root = [3,2,4,1] |
提示:
- 树中的节点数介于
0
和104
之间。 - 每个节点的值介于
-104
和104
之间。 - 树中的所有值 互不相同 。
- 给定的树为二叉搜索树。
解析
根据给出的示例可以发现,所谓的累加树,其实就是根据中序遍历的顺序,求出每个节点到最后一个节点值的累加和作为当前节点的值。
法1
- 使用两次中序遍历:
- 1、第一次遍历记录每个元素的值,并且求出最大值
- 2、第二次遍历修改每个元素的值
- 规律:当前元素的新值等于前驱节点的新值-前驱节点的旧值
- 所以:使用三个指针来记录值的变化,
- 其中
preOld
指针指向前驱节点的旧值 preNew
指针指向前驱节点的新值tmp
指针记录当前节点修改前的值
- 其中
代码
1 | c++复制代码class Solution |
法2
对二叉搜索树进行中序遍历可以得到一个有序数组,数组元素更新的规律可以看做是从后向前累加,所以可以使用逆向中序遍历,即遍历顺序为 右->中->左
- 使用递归方法
- 1、确定递归的参数与返回值
- 参数:当前节点
cur
以及 前驱节点pre
- 参数:当前节点
- 2、确定递归的终止条件
- 遇到空节点直接返回
- 3、确定单层循环的逻辑
- 先遍历右孩子,
- 遍历根节点,同时修改节点元素的值
- 最后左孩子
- 1、确定递归的参数与返回值
代码
1 | c++复制代码class Solution |
本文转载自: 掘金