思路
最好想到的就是暴力,一个节点遍历一次树,每次在遍历的过程中累加出值原树中大于或等于当前节点(当然也算当前节点喽)的值之和。
时间:O(n²)
再稍微优化一点,之遍历一次树,把值存在数组里,遍历数组求和,但要遍历n次数组,时间还是O(n²)。
我则没有用这个方法。
我运气比较好,滚轮滚多了,直接看到了下面的图免疫了忽悠。那看图找规律,不就是右中左遍历经过的点求和么......于是,我那中序遍历模板改了几行,一交。AC了?!
用时击败100.00% 内存击败20.25%
那为什么这样能对呢?
这不是普通二叉树,是二叉搜索树!
这意味着,如果中序遍历二叉搜索树遍历过的节点依次存在一个数组里,数组就是升序的,原树中大于或等于当前结点值的节点的值之和就是数组中当前节点及更靠后的节点值之和。那这个数组是中序遍历(左中右)得到的,为升序,那反向中序遍历(右中左)经过的结点就是降序。这样,我们就可以在反向中序遍历过程中用一个变量求和,把每个经过的节点的值赋为当前变量的值,遍历后的数就是累加树了。
这样时间复杂度就为O(n)了。
代码
cpp
class Solution {
public:
int s;
int dg(TreeNode* a) {
if(!a) {
return 0;
}
dg(a->right);
s+=a->val;
a->val=s;
dg(a->left);
return 0;
}
TreeNode* convertBST(TreeNode* r) {
dg(r);
return r;
}