1. 程式人生 > >leetcode 538. 把二叉搜尋樹轉換為累加樹

leetcode 538. 把二叉搜尋樹轉換為累加樹

題目描述:

給定一個二叉搜尋樹(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);
    }
};