538. 把二叉搜尋樹轉換為累加樹
阿新 • • 發佈:2019-02-01
題目分析:
其實只要看到BST就應該立馬想到它的一個重要的性質:其中序遍歷序列是非遞減的。因此本題目的思路就是:先求樹中所有結點值的和sum,然後中序遍歷BST,用sum代替之前的結點值,然後更新sum。
請看下面的程式碼:
class Solution {
public:
void inorder(TreeNode*root,int &sum){ //中序遍歷,將BST轉化為累加樹,因為sum的值需要不斷的變化,因此使用引用
if(root==NULL){
return;
}
inorder(root-> left,sum); //遞迴中序遍歷左子樹
int temp=root->val; //先保留該節點的值
root->val=sum; //更新該節點的值為sum
sum-=temp; //更新sum的值,減去之前保留的結點的值
inorder(root->right,sum); //遞迴中序遍歷右子樹。
}
void inorderSum(TreeNode*root,int &sum){ //中序遍歷對BST求和,sum要使用引用的方式
if(root==NULL){
return;
}
inorderSum(root->left,sum);
sum+=root->val;
inorderSum(root->right,sum);
}
TreeNode* convertBST(TreeNode* root) {
int sum =0;
inorderSum(root,sum); //呼叫函式
inorder(root,sum);
return root;
}
};