538.将二叉搜索树转为累加树 递归 C++实现
题目描述
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
解题思路——反序中序遍历
二叉搜索树:右节点的值比根节点大,左节点的值比根节点小。
需要依此遍历每个节点并且修改它的值。
关键:按照从大到小遍历所有的节点,并且记录遍历过的节点值,将它加到当前节点上。
也就是按照右根左的顺序进行递归,在遍历每个节点前,先将大于它的所有结点都遍历一遍(即右子树中)。
代码
/**
* 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 {
private:
int value=0; //累加值
public:
TreeNode* convertBST(TreeNode* root) {
if(!root) //如果是空节点,直接返回
return NULL;
convertBST(root->right);//右子树递归
value += root->val;//累加遍历过的值
root->val = value;//将累加值加到当前节点上(根)
convertBST(root->left);//左子树遍历
return root; //最后返回根节点
}
};
复杂度
时间复杂度 O(n)
每个节点都被遍历一次,也就是convertBST函数只被调用一次,复杂度是O(n)。convertBST函数执行的操作是常数时间。所以整体的时间复杂度是O(n).
空间复杂度 O(n)
考虑最坏情况,一棵树只有右子树(或者只有左子树),调用会一直增长到右边的最后一个节点,也就是包含n个节点,所以空间复杂度是O(n).
反思总结
- 一些基础知识掌握的不太好,二叉树这个数据结构的特性。
- 二叉树和递归是经常在一起用的。
- 二叉树的遍历次序(递归顺序)根据题目意思可以自己调整。
- DFS深度遍历,BFS广度遍历。
- 每次只对一个节点进行分析,不要把他的左右节点都进行更新。这样容易混乱,重复。