没看答案。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import defaultdict
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
mid = []
dic = defaultdict(int)
# BST中序遍历得到的是递增数组
def mid_dfs(root):
if not root:
return
mid_dfs(root.left)
mid.append(root.val)
mid_dfs(root.right)
mid_dfs(root)
# 得到每个节点的替换值
for i in range(len(mid)):
dic[mid[i]] = sum(mid[i:])
# 替换节点值,构造累加树
def build_sum_tree(root):
if not root:
return
tmp = root.val
root.val = dic[tmp]
build_sum_tree(root.left)
build_sum_tree(root.right)
build_sum_tree(root)
return root
反向中序遍历BST,遍历过程中可以不断更新节点值。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import defaultdict
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
tmp = 0
# BST反向中序遍历得到的是递减数组
def Reverse_mid_dfs(root):
if not root:
return
# nonlocal关键字用于函数内嵌套函数的场景
# 作用为将嵌套函数中的变量与被嵌套函数的同名变量捆绑在一起
nonlocal tmp
Reverse_mid_dfs(root.right)
tmp += root.val
root.val = tmp
Reverse_mid_dfs(root.left)
Reverse_mid_dfs(root)
return root