給定一個二叉搜索樹(Binary Search Tree),把它轉換成爲累加樹(Greater Tree),使得每個節點的值是原來的節點值加上所有大於它的節點值之和。
例如:
輸入: 二叉搜索樹:
5
/ \
2 13
輸出: 轉換爲累加樹:
18
/ \
20 13
使用遞歸:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int sum=0;
struct TreeNode* convertBST(struct TreeNode* root){
if(root==NULL) return root;
convertBST(root->right);
root->val+=sum;
sum=root->val;
convertBST(root->left);
return root;
}
可是在上述代碼進行提交驗證時,出現了一個小問題:
而第一個用例爲:[5,2,13] 在運行完第一個用例後sum==20,所以進行第二個用例計算時,sum的初值爲20。原因我猜測是:測試用例的程序在第一次測試時進行了函數外 int sum=0;的語句執行,但在後續函數測試時,直接進行了convertBST()的重複調用,沒有執行函數外 int sum=0;的語句,導致sum初值發生錯誤;
所以,我將代碼改爲:
void sumBST(struct TreeNode* root,int * sum){
if(root==NULL) return root;
sumBST(root->right,sum);
root->val+=*sum;
*sum=root->val;
sumBST(root->left,sum);
}
struct TreeNode* convertBST(struct TreeNode* root){
int sum=0;
sumBST(root,&sum);
return root;
}
在函數中調用函數,並在每次調用前對sum值賦值爲0;這樣在系統跑測試用例時就會每次都對sum進行初始化爲0的操作。