亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++二叉搜索樹實例分析

發布時間:2022-03-28 14:09:41 來源:億速云 閱讀:137 作者:iii 欄目:大數據

本篇內容介紹了“C++二叉搜索樹實例分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

獨一無二的二叉搜索樹

Given an integer n, generate all structurally unique BST"s (binary search trees) that store values 1 ... n.

Example:

Input: 3
Output:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
Explanation:
The above output corresponds to the 5 unique BST"s shown below:

   1         3     3      2      1
       /     /      /      
3     2     1      1   3      2
/     /                       
2     1         2                 3

這道題是之前的 Unique Binary Search Trees 的延伸,之前那個只要求算出所有不同的二叉搜索樹的個數,這道題讓把那些二叉樹都建立出來。這種建樹問題一般來說都是用遞歸來解,這道題也不例外,劃分左右子樹,遞歸構造。這個其實是用到了大名鼎鼎的分治法 Divide and Conquer,類似的題目還有之前的那道 Different Ways to Add Parentheses 用的方法一樣,用遞歸來解,劃分左右兩個子數組,遞歸構造。剛開始時,將區間 [1, n] 當作一個整體,然后需要將其中的每個數字都當作根結點,其劃分開了左右兩個子區間,然后分別調用遞歸函數,會得到兩個結點數組,接下來要做的就是從這兩個數組中每次各取一個結點,當作當前根結點的左右子結點,然后將根結點加入結果 res 數組中即可,參見代碼如下:

解法一:

class Solution {
public:
    vector<TreeNode*> generateTrees(int n) {
        if (n == 0) return {};
        return helper(1, n);
    }
    vector<TreeNode*> helper(int start, int end) {
        if (start > end) return {nullptr};
        vector<TreeNode*> res;
        for (int i = start; i <= end; ++i) {
            auto left = helper(start, i - 1), right = helper(i + 1, end);
            for (auto a : left) {
                for (auto b : right) {
                    TreeNode *node = new TreeNode(i);
                    node->left = a;
                    node->right = b;
                    res.push_back(node);
                }
            }
        }
        return res;
    }
};

我們可以使用記憶數組來優化,保存計算過的中間結果,從而避免重復計算。注意這道題的標簽有一個是動態規劃 Dynamic Programming,其實帶記憶數組的遞歸形式就是 DP 的一種,memo[i][j] 表示在區間 [i, j] 范圍內可以生成的所有 BST 的根結點,所以 memo 必須是一個三維數組,這樣在遞歸函數中,就可以去 memo 中查找當前的區間是否已經計算過了,是的話,直接返回 memo 中的數組,否則就按之前的方法去計算,最后計算好了之后要更新 memo 數組,參見代碼如下:

解法二:

class Solution {
public:
    vector<TreeNode*> generateTrees(int n) {
        if (n == 0) return {};
        vector<vector<vector<TreeNode*>>> memo(n, vector<vector<TreeNode*>>(n));
        return helper(1, n, memo);
    }
    vector<TreeNode*> helper(int start, int end, vector<vector<vector<TreeNode*>>>& memo) {
        if (start > end) return {nullptr};
        if (!memo[start - 1][end - 1].empty()) return memo[start - 1][end - 1];
        vector<TreeNode*> res;
        for (int i = start; i <= end; ++i) {
            auto left = helper(start, i - 1, memo), right = helper(i + 1, end, memo);
            for (auto a : left) {
                for (auto b : right) {
                    TreeNode *node = new TreeNode(i);
                    node->left = a;
                    node->right = b;
                    res.push_back(node);
                }
            }
        }
        return memo[start - 1][end - 1] = res;
    }
};

“C++二叉搜索樹實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

太仆寺旗| 岳池县| 定襄县| 通道| 喀喇沁旗| 玉山县| 苍溪县| 岑巩县| 互助| 新巴尔虎右旗| 九龙坡区| 盐津县| 确山县| 怀远县| 邯郸市| 峨山| 雷波县| 漳平市| 前郭尔| 临武县| 兴和县| 綦江县| 柞水县| 龙海市| 泸溪县| 祁连县| 溧阳市| 丰县| 昆明市| 台江县| 长治县| 芦山县| 凤翔县| 镇坪县| 平凉市| 平罗县| 正宁县| 平塘县| 万载县| 绍兴县| 南开区|