最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現LeetCode(95.獨一無二的二叉搜索樹之二)

 更新時間:2021年07月19日 11:28:37   作者:Grandyang  
這篇文章主要介紹了C++實現LeetCode(95.獨一無二的二叉搜索樹之二),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下

[LeetCode] 95. Unique Binary Search Trees II 獨一無二的二叉搜索樹之二

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 用的方法一樣,用遞歸來解,劃分左右兩個子數組,遞歸構造。剛開始時,將區(qū)間 [1, n] 當作一個整體,然后需要將其中的每個數字都當作根結點,其劃分開了左右兩個子區(qū)間,然后分別調用遞歸函數,會得到兩個結點數組,接下來要做的就是從這兩個數組中每次各取一個結點,當作當前根結點的左右子結點,然后將根結點加入結果 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;
    }
};

我們可以使用記憶數組來優(yōu)化,保存計算過的中間結果,從而避免重復計算。注意這道題的標簽有一個是動態(tài)規(guī)劃 Dynamic Programming,其實帶記憶數組的遞歸形式就是 DP 的一種,memo[i][j] 表示在區(qū)間 [i, j] 范圍內可以生成的所有 BST 的根結點,所以 memo 必須是一個三維數組,這樣在遞歸函數中,就可以去 memo 中查找當前的區(qū)間是否已經計算過了,是的話,直接返回 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++實現LeetCode(95.獨一無二的二叉搜索樹之二)的文章就介紹到這了,更多相關C++實現獨一無二的二叉搜索樹之二內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Qt掃盲篇之QRegExp正則匹配類總結

    Qt掃盲篇之QRegExp正則匹配類總結

    這篇文章主要給大家介紹了關于Qt掃盲篇之QRegExp正則匹配類總結的相關資料,QRegExp是Qt框架中的一個類,用于進行正則表達式的匹配和處理,它提供了多種模式來匹配不同的字符串,需要的朋友可以參考下
    2023-12-12
  • 詳細分析C++ 異常處理

    詳細分析C++ 異常處理

    這篇文章主要介紹了C++ 異常處理的的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • c++ *運算符重載

    c++ *運算符重載

    運算符重載重載運算符是C++ 的一個重要特性,使用運算符重載, 的一個重要特性,使用運算符重載, 重載運算符是程序員可以把C++ 運算符的定義擴展到運算分量是對象
    2014-09-09
  • C++中String增刪查改模擬實現方法舉例

    C++中String增刪查改模擬實現方法舉例

    這篇文章主要給大家介紹了關于C++中String增刪查改模擬實現方法的相關資料,String是C++中的重要類型,程序員在C++面試中經常會遇到關于String的細節(jié)問題,甚至要求當場實現這個類,需要的朋友可以參考下
    2023-11-11
  • C程序讀取鍵盤碼的方法

    C程序讀取鍵盤碼的方法

    這篇文章主要介紹了C程序讀取鍵盤碼的方法,運行時可通過鍵盤按鍵獲取其對應的鍵盤碼,文章最后附帶了鍵盤碼與按鍵的對照表,需要的朋友可以參考下
    2014-09-09
  • C++使用文件實現學生信息管理系統(tǒng)

    C++使用文件實現學生信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++使用文件實現學生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C/C++實現線性順序表的示例代碼

    C/C++實現線性順序表的示例代碼

    使用順序存儲結構的線性存儲結構的表為線性順序表。本文將分別利用C語言和C++實現線性順序表,文中示例代碼講解詳細,需要的可以參考一下
    2022-05-05
  • C語言求矩陣的各列元素之和的代碼示例

    C語言求矩陣的各列元素之和的代碼示例

    這篇文章主要介紹了C語言求矩陣的各列元素之和的代碼示例,這也是經常作為競賽和計算機專業(yè)考試的基礎練習出現的題目,需要的朋友可以參考下
    2016-07-07
  • C語言超詳細分析多進程的概念與使用

    C語言超詳細分析多進程的概念與使用

    在一個項目中并發(fā)執(zhí)行任務時多數情況下都會選擇多線程,但有時候也會選擇多進程,例如可以同時運行n個記事本編輯不同文本,由一個命令跳轉到另外一個命令,或者使用不同進程進行協(xié)作
    2022-08-08
  • C++布隆過濾器的使用示例

    C++布隆過濾器的使用示例

    寧可錯殺一千,也不放過一個,這是布隆過濾器的特點,本文主要介紹了C++布隆過濾器的使用示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09

最新評論

宁河县| 黄梅县| 尼勒克县| 长治县| 泰宁县| 安西县| 平陆县| 滕州市| 临江市| 沁水县| 措勤县| 中卫市| 盈江县| 余庆县| 富阳市| 蒲城县| 三明市| 永平县| 玛曲县| 大庆市| 乐陵市| 鹤庆县| 临澧县| 西宁市| 马山县| 和田县| 噶尔县| 饶平县| 商水县| 临清市| 汤阴县| 旺苍县| 永川市| 凭祥市| 玉林市| 长子县| 柘城县| 鸡东县| 曲麻莱县| 克拉玛依市| 吉林市|