leetcode 538. 把二叉搜尋樹轉換為累加樹
阿新 • • 發佈:2018-12-31
題目描述:
給定一個二叉搜尋樹(Binary Search Tree),把它轉換成為累加樹(Greater Tree),使得每個節點的值是原來的節點值加上所有大於它的節點值之和。
例如:
輸入: 二叉搜尋樹: 5 / \ 2 13 輸出: 轉換為累加樹: 18 / \ 20 13
思路一、看到題目第一個想法是中序遍歷訪問二叉樹每個結點,得到有序序列並按順序儲存在陣列中,接下來就只要再遍歷一遍二叉樹,並根據陣列把相應的值加到各結點中就ok了。
思路二、用遞迴的方法:(自創)
1.當前結點值要加的值有:父節點傳遞的值(即s,初始為0)、右孩子樹所有結點的值(sum_value()函式來求).
2.更新完當前結點的值後,如果左孩子存在,則通過遞迴呼叫左子樹把當前結點更新後的值傳給左孩子結點(root->left=f(root->left,root->val);)
3.遞迴呼叫右子樹,並把傳給當前結點的值傳遞給右孩子(root->right=f(root->right,s);)
程式碼:
class Solution { public: TreeNode* convertBST(TreeNode* root) { int s=0; return f(root,s); } TreeNode* f(TreeNode* root,int s){ if(root==NULL)return NULL; int sum=0; sum_value(root->right,sum); root->val+=sum+s; if(root->left) root->left=f(root->left,root->val); root->right=f(root->right,s); return root; } void sum_value(TreeNode* root,int&sum){ if(root==NULL)return; sum+=root->val; sum_value(root->left,sum); sum_value(root->right,sum); } };