给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 二叉搜索树: 5 / \ 2 13 输出: 转换为累加树: 18 / \ 20 13
首先讲讲思路:
1.对于一个点的右子树,需要将其自身、其所有的右节点、和一个比它大的家伙XXX给加上。
2.前面两个加数都好理解,那么什么叫做比它大的家伙XXX。其实就是,若你是某个节点的左节点,那么这个XXX就是你的根节点,那么我要是右节点呢?那么就往上找,看有没有一个根节点是其父节点的左子树。
下面原代收奉上:
AC解
class Solution {
public:
TreeNode * convertBST(TreeNode* root) {
if (root == NULL)
return NULL;
convertBST_(root,0);
return root;
}
void convertBST_(TreeNode* root,int Last_Root)
{
if (root == NULL)
return;
root->val = (root->val) + Add_all(root->right) + Last_Root;
convertBST_(root->left, root->val);
convertBST_(root->right, Last_Root);
}
int Add_all(TreeNode* root)
{
if (root == NULL)
return 0;
int Res = (Add_all(root->right) + Add_all(root->left)+root->val);
return Res;
}
};