Leetcode#538 | Nobilta's Blog
0%

Leetcode#538

Leetcode#538把二叉搜索树转换为累加树

题目链接
刚开始看题的时候没有注意是二叉搜索树,所以只想到了用最傻x的方法:先将整个二叉树遍历一遍,取得所有val然后进行排序,再遍历二叉树分别,配合已经排序好的val数组进行循环累加。这样也是可以过的,但是不管时间复杂度还是空间复杂度都很高。
附一个不需要注释就能看懂的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public:
void dfs(TreeNode* node,vector<int>& nums)
{
nums.push_back(node -> val);
if(node -> left != nullptr)
dfs(node -> left,nums);
if(node -> right != nullptr)
dfs(node -> right,nums);
}
void dfs1(TreeNode* node,vector<int>& nums)
{
int sum = 0;
for(int i = 0 ; i < nums.size() ; i++)
{
if( nums[i] > node -> val)
sum+=nums[i];
}
node -> val += sum;
if(node -> left != nullptr)
dfs1(node -> left,nums);
if(node -> right != nullptr)
dfs1(node -> right,nums);
}
TreeNode* convertBST(TreeNode* root) {
vector<int>nums;
if(root == nullptr)
return nullptr;
dfs(root,nums);
sort(nums.begin(),nums.end());
dfs1(root,nums);
return root;
}
};

因为是二叉搜索树,所以已经排好了顺序,我们只需要通过反向中序遍历,就可以实现从大到小的累加和排序,只需要一遍就可以实现效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int sum = 0;

TreeNode* convertBST(TreeNode* root) {
if (root != nullptr) {
convertBST(root->right);
sum += root->val;
root->val = sum;
convertBST(root->left);
}
return root;
}
};
您的支持将鼓励我继续创作!