给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 原始二叉搜索树:
5
/ \
2 13
输出: 转换为累加树:
18
/ \
20 13
注意:本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同
1. 递归法
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int prev = 0;
TreeNode* convertBST(TreeNode* root) {
if (root)
{
convertBST(root->right);
root->val += prev;
prev = root->val;
convertBST(root->left);
}
return root;
}
};
2. 迭代法
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
TreeNode *p = root;
stack<TreeNode*> stk;
int prev = 0;
while (p || !stk.empty())
{
if (p)
{
stk.push(p);
p = p->right;
}
else
{
p = stk.top();
stk.pop();
p->val += prev;
prev = p->val;
p = p->left;
}
}
return root;
}
};