给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 二叉搜索树: 5 / \ 2 13 输出: 转换为累加树: 18 / \ 20 13
思路:
本题使用了类似中序遍历的迭代法,关于中序遍历的迭代法请看:二叉树的中序遍历。
中序遍历的顺序:左子节点、根节点、右子节点;
本题是二叉搜索树,右子树所有节点的值都大于根节点,所以遍历的顺序应该是:右子节点、根节点、左子节点
设置变量curr=0,表示当前的累加值
迭代法如下:令p = root,当p不为空或栈中还有元素时进行以下循环
1、当p不为空时,将p的右子节点加入栈,并让p=p.right
2、出栈顶元素,让这个元素的值加上累加值,更新累加值为此元素的值,并让p=p.left
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var convertBST = function(root) {
var stack = [],
curr = 0,
p = root;
while (p || stack.length) {
while (p) {
stack.push(p)
p = p.right
}
p = stack.pop()
p.val += curr
curr = p.val
p = p.left
}
return root
};