Leecode 538 - 把二叉搜索树转换为累加树(Leecode 1038)
1 题目
Leecode 538:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/
Leecode 1038:https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree
2 题意
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 原始二叉搜索树:
5
/ \
2 13
输出: 转换为累加树:
18
/ \
20 13
3 思路
author's blog == http://www.cnblogs.com/toulanboy/
3. 1 二叉搜索树
(1)定义:若一颗二叉树,其左边的节点都小于等于根节点,右边的节点都大于等于根节点,那么该树被称为二叉搜索树。
(2)特征:中序遍历的结果是个递增序列。
3.2 解题思路
题目需要我们把每个节点的值更改为,大于等于该值的所有数值的和(包含他本身)。
我们可以借助遍历获得每个点的数值,然后统计起来利用。
(1)一般的思维:
- 可以考虑先遍历每个点,记录每个点的情况。
- 由于中序便利出来的是有序的升序序列,那么我们可以得知大于等于某个点的情况。
- 只需再遍历一遍进行更新。但是这个方法需要2次遍历,而且需要统计后缀和。
(2)进一步思考
这里看了题解才恍然大悟。惭愧(--。
较好的方案:执行反的中序遍历,遍历逻辑为:右子树、根节点、左子树,就会得到一个降序序列。在这次遍历的过程中,当我们遍历到第i个点时,大于等于第i个点所有节点都已经被遍历,故可以直接得到第i个点应该被更新的数值。
4 代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
//author's blog == http://www.cnblogs.com/toulanboy/
class Solution {//代码是Leecode 538的
public:
int sum = 0;
void get_tree_sum(TreeNode * root){
if(root == NULL)
return;
get_tree_sum(root->right);
sum += root->val;//累加大于等于当前值的所有数值和
root->val = sum;//当前节点的值 便是 上述统计的和
get_tree_sum(root->left);
return;
}
TreeNode* convertBST(TreeNode* root) {
get_tree_sum(root);
return root;
}
};
❤ 如果这篇文章对你有帮助,麻烦来个大拇指👍,谢谢。