LeetCode-1038. 從二叉搜索樹到更大和樹

題目描述 從二叉搜索樹到更大和樹

給出二叉搜索樹的根節(jié)點(diǎn),該二叉樹的節(jié)點(diǎn)值各不相同,修改二叉樹,使每個節(jié)點(diǎn) node 的新值等于原樹中大于或等于 node.val 的值之和。

提醒一下,二叉搜索樹滿足下列約束條件:

節(jié)點(diǎn)的左子樹僅包含鍵小于節(jié)點(diǎn)鍵的節(jié)點(diǎn)。
節(jié)點(diǎn)的右子樹僅包含鍵大于節(jié)點(diǎn)鍵的節(jié)點(diǎn)。
左右子樹也必須是二叉搜索樹

示例


輸入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
輸出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

解題思路

  • 想的是先把所有節(jié)點(diǎn)的和加起來
  • 然后中序遍歷,把當(dāng)前節(jié)點(diǎn)的值變成所有節(jié)點(diǎn)和減去自己左子樹的和就行

看了一下大佬們的思想,直接后序遍歷就得了。果然簡潔很多,所以題目寫出來之后還是要多優(yōu)化啊,就加分很多。

代碼

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* bstToGst(TreeNode* root) {
        int sum=cal_sum(root);
        int temp=0;
        putnum(root, sum, temp);
        return root;
    }

    void putnum(TreeNode* root, int sum, int &temp){
        if(!root) return ;
        putnum(root->left, sum, temp);
        temp += root->val;
        root->val += sum - temp;
        putnum(root->right, sum, temp);
    }

    int cal_sum(TreeNode* root){
        int res=0;
        if(!root) return 0;
        res = root->val + cal_sum(root->left) + cal_sum(root->right);
        return res;
    }
};

優(yōu)化代碼

class Solution {
public:
    int val;
    TreeNode* bstToGst(TreeNode* root) {
        set(root);
        return root;
    }
    void set(TreeNode* root) {
        if(root) {
            set(root->right);
            root->val += val;
            val = root->val;
            set(root->left);
        }
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容