1. 程式人生 > 其它 >刷題-力扣-1038. 把二叉搜尋樹轉換為累加樹

刷題-力扣-1038. 把二叉搜尋樹轉換為累加樹

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

題目連結

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題目描述

給定一個二叉搜尋樹,請將它的每個節點的值替換成樹中大於或者等於該節點值的所有節點值之和。

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

節點的左子樹僅包含鍵 小於 節點鍵的節點。
節點的右子樹僅包含鍵 大於 節點鍵的節點。
左右子樹也必須是二叉搜尋樹。
注意:該題目與 538:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/

相同

示例 1:

輸入:[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]

示例 2:

輸入:root = [0,null,1]
輸出:[1,null,1]

示例 3:

輸入:root = [1,0,2]
輸出:[3,3,2]

示例 4:

輸入:root = [3,2,4,1]
輸出:[7,9,4,10]

提示:

  • 樹中的節點數介於 1 和 100 之間。
  • 每個節點的值介於0 和100之間。
  • 樹中的所有值 互不相同 。
  • 給定的樹為二叉搜尋樹。

題目分析

  1. 根據題目描述,將二叉搜尋樹轉換為累加樹,
  2. 累加樹是將二叉搜尋樹按照中序排列,如示例1中的二叉搜尋樹按照中序展開為[0, 1, 2, 3, 4, 5, 6, 7, 8],從後向前一次累加,即累加樹的中序展開為[36, 36, 35, 33, 30, 26, 21, 15, 8]
  3. 使用深度優先搜尋按照先右子樹、再根節點、後左子樹的順序遍歷二叉搜尋樹,依次記錄累加的和,改變節點的值

程式碼

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* bstToGst(TreeNode* root) {
        dfs(root, 0);
        return root;
    }

private:
    int dfs(TreeNode* root, int val) {
        if (!root) return val;
        int right = dfs(root->right, val);
        root->val += right;
        int left = dfs(root->left, root->val);
        return left;
    }
};