Leetcode-1038-把二叉搜索树转换为累加树

Leetcode-1038-把二叉搜索树转换为累加树

思路:反向中序遍历

题目描述

  • 给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换成累加树(Greater Sum Tree),使得每个节点的node 的新值等于原书中大于等于node.val 的值之和。

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

  • 节点的左子树仅包含键 小于 节点键的节点。
  • 节点的右子树仅包含键 大于 节点键的节点。
  • 左右子树也必须是二叉搜索树。

示例 1:

mark

1
2
3
4
5
6
7
8
9
10
11
12
13
14
示例 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]

方法 : 反向中序遍历

  • 关于二叉搜索树的问题,第一个想到的就是中序遍历,这是二叉搜索树的一个非常重要的性质
  • 二叉搜索树的中序遍历是一个递增的有序序列

mark

观察累加前中序遍历累加后中序遍历,我们会发现,其实后者就是前者的一个从后的累加结果。

那么问题就迎刃而解了,我们秩序反向中序遍历即可,并且把每次的节点值进行累加,就能得到最终的累加树。并且保证了这样只会访问每个节点一次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int sum = 0;
public TreeNode bstToGst(TreeNode root) {
if(root != null){
// 1. 如果是叶子节点的话
// 进行反向的中序遍历
bstToGst(root.right); // 递归右子树
sum = sum + root.val; // 累加
root.val = sum; // 更新节点的值
bstToGst(root.left); // 递归左子树
}

return root;
}
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信