题目描述
原题链接:538. 把二叉搜索树转换为累加树
解题思路
累加树中的结点的意思:二叉搜索树中的本结点和右侧左子树中最大值之和。
对于BST一类的题,如果直接从改变树的结构来思考,试下起来会过于复杂。根据BST的性质,可以将其按照增序数组来思考,能够利用性质简化解题思路。
如果作为数组来看,本题实际上是让当前数组元素的值变为当前值+后续增序数组的值。那么,要做的就只是,从后往前遍历,每次加上后面元素的累加之和即可。再回到本题来看,我们采用右中左
的方式,来实现上述讨论的数组这一过程。每次先遍历右子树,再对中间结点进行操作,再去遍历左子树即可。配合一个指向前方元素值之和的指针pre
来记录已遍历的元素之和,在遇到中间结点时,进行相加操作。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int preval = 0;
TreeNode* convertBST(TreeNode* root) {
if(!root) return NULL;
if(root->right) convertBST(root->right); // 右
root->val += preval; // 中:相加并更新前一个结点值
preval = root->val;
if(root->left) convertBST(root->left); // 左
return root;
}
};
参考文章:538. 把二叉搜索树转换为累加树