链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 原始二叉搜索树:
5
/ \
2 13
输出: 转换为累加树:
18
/ \
20 13
题目给的是一颗二叉搜索树,二叉搜索树的特性是左子树节点的值小于根节点的值,根节点的值小于右子树节点的值。
从二叉搜索树的性质可以看到,二叉搜索树的中序遍历是一个单调递增的序列,如果我们对二叉搜索树进行反向中序遍历,将得到一个单调递减的序列。
题意要求将二叉二搜索转换成为累加树,让当前每个节点的值是原来的节点值加上所有大于它的节点值之和。所以,只要我们反向中序遍历时,记录所有节点值的和,同时不断更新当前节点的值即可。
时间复杂度:O(n)
空间复杂度:O(n)
class Solution:
def convertBST(self, root: TreeNode) -> TreeNode:
def helper(root):
nonlocal tmp
if not root:
return
helper(root.right)
tmp+=root.val
root.val=tmp
helper(root.left)
tmp=0
helper(root)
return root
通过右根左反向中序遍历的顺序进行迭代,我们设置一个栈来进行模拟,将所有的右子树的节点入栈,每当出栈一个节点时,就计算累加值,当右节点遍历完毕后切换到左节点,重复以上过程,直到遍历完所有节点。
时间复杂度:O(n)
空间复杂度:O(n)
# 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:
tmp,stack,node=0,[],root
while stack or node:
while node:
stack.append(node)
node=node.right
node=stack.pop()
tmp+=node.val
node.val=tmp
node=node.left
return root
如果大家觉得文章还不错,可以关注下我喔,会定期分享的。