1.题目
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 二叉搜索树:
5
/ \
2 13输出: 转换为累加树:
18
/ \
20 13来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.code
/**
* 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) {
stack<TreeNode*>s;
TreeNode *tree;
tree=root;
int sum=0;
while(tree||!s.empty())
{
while(tree)
{
s.push(tree);//根节点以及右儿子压入堆栈
tree=tree->right;
}
if(!s.empty())//如果堆栈不为空
{
tree=s.top();//弹出右儿子
sum+=tree->val;
tree->val=sum;
s.pop();
tree=tree->left;
}
}
return root;
}
};
3.分析
这道题,似乎很巧妙。根据二叉搜索树的特点:右子树大于根节点,左子树小于根节点。由此可以知道,最右边的右节点是最大的值,不需要改动,而其根节点的值需要更新为其自身的值加上右节点的值,而根节点左儿子的值则为自身+加上已经遍历过的两个节点。依次类推,我们发现,只要我们按照:右->根->左的顺序遍历树,设置一个计数器,将遍历过的节点值加和,赋值给新节点则可以完成累加树。
至于遍历的过程,其实只需要将中序遍历的左右顺序换一下即可。