538.把二叉搜索树转换为累加树

一、题目描述

给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

例如:

1
2
3
4
5
6
7
8
9
输入: 原始二叉搜索树:
5
/ \
2 13

输出: 转换为累加树:
18
/ \
20 13

注意:本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同

二、题解

1.递归

1.1 思路

  1. 二叉搜索树的中序遍历是递增数列,则中序遍历则是递减序列
  2. 声明一个累加值res = 0;
  3. 利用这一性质,对其进行逆中序遍历,开始使用累加值更新节点值
  4. 在遍历左子树前,要更新res的值

1.2 代码

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
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
void inorderReverse(struct TreeNode *root, int *res)
{
if (root == NULL)
return 0;
inorderReverse(root->right, res);
root->val += *res;//更新root节点的值
*res = root->val;//更新res的值
inorderReverse(root->left, res);
}

struct TreeNode *convertBST(struct TreeNode *root)
{
if (root == NULL)
return NULL;
int res = 0;
inorderReverse(root, &res);
return root;
}

顺便把1038题也做了 :)