描述
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 二叉搜索树:
5
/ \
2 13
输出: 转换为累加树:
18
/ \
20 13
思路
我们知道 二叉搜索树 中序遍历时从小到大的顺序 那么将 中序遍历时的左右打印顺序互换, 则变成从大到小顺序 此时我们只需要记录一个add值 累计即可
比如:
13 5 2
cur = 13 时 add = 0 则 cur = cur + add cur = 13 add 变成 0 + 13 = 13
cur = 5 时 add = 13 则 cru = cur + add cur = 18 add 变成 13 + 5 = 18
cur = 2 时 add = 18 则 cru = cur + add cur = 20 add 变成 18 + 2 = 20
实现
func ConvertBST(root *TreeNode) *TreeNode {
stack := make([]*TreeNode, 0)
add := 0
curNode := root
for curNode != nil || len(stack) > 0 {
for curNode != nil {
stack = append(stack, curNode)
curNode = curNode.Right
}
top := stack[len(stack)-1]
stack = stack[0 : len(stack)-1]
curNode = top.Left
topVal := top.Val
top.Val += add
add += topVal
}
return root
}