【LeetCode 538】把二叉搜索树转换为累加树

1. 题目描述

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

例如:

输入: 原始二叉搜索树:

          5
        /   \
       2     13

输出: 转换为累加树:

         18
        /   \
      20     13

2. 解题思路

(1)这种求节点和的树的题型首先想到递归;
(2)再看是二叉搜索树,二叉搜索树的性质很明显:二叉搜索树的左子树的所有值均比根节点的值要小,右子树的值均比根节点的值要大
(3)题干要求的是 【使得每个节点的值是原来的节点值加上所有大于它的节点值之和】 也就是比该节点大的值加上该节点的和,那么应该运用反序中序遍历
(4)先从右子树开始,可以将右子树看作一个整体,进行递归。由于右子树的值比根节点的值大,所以右子树就相当于是自身;
(5)然后对根节点进行操作,根节点就要加上右子树所有节点的值,即此时要加上sum(root.val = root.val + sum),然后令 sum 为 root.val 的值,好对左子树进行操作(sum = root.val);
(6)最后对左子树进行递归。

简单点说就是:

  • 先将右子树转换为累加树,并记录右子树的累加和 sum;
  • 然后处理根节点,根节点的值 = 根节点的值 + sum;
  • 然后转换左子树。

3. 代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def convertBST(self, root: TreeNode) -> TreeNode:
        self.DFS(root, 0)
        return root

    def DFS(self, root, sum):
        if not root:
            return sum
        sum = self.DFS(root.right, sum)
        root.val = root.val + sum
        sum = root.val
        sum = self.DFS(root.left, sum)
        return sum
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值