欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java動態(tài)規(guī)劃方式解決不同的二叉搜索樹

 更新時間:2022年10月21日 09:17:20   作者:劉婉晴  
二叉搜索樹作為一個經(jīng)典的數(shù)據(jù)結(jié)構(gòu),具有鏈表的快速插入與刪除的特點,同時查詢效率也很優(yōu)秀,所以應(yīng)用十分廣泛。本文將詳細(xì)講講二叉搜索樹的原理與實現(xiàn),需要的可以參考一下

一、題目描述

給你一個整數(shù) n ,求恰由 n 個節(jié)點組成且節(jié)點值從 1 到 n 互不相同的 二叉搜索樹 有多少種?返回滿足題意的二叉搜索樹的種數(shù)。

來源:https://leetcode.cn/problems/unique-binary-search-trees/

二、思路

本題可以使用動態(tài)規(guī)劃的方式解決,我們先來看一下大題思路。以 n = 3 為例,n = 3 時的不同的二叉搜索樹數(shù)目,可以通過分別 以 1 為根節(jié)點,以 2 為根節(jié)點,以 3 為根節(jié)點 的不同的二叉搜索樹的數(shù)量加和獲得。

那么問題就來到了如何得到 以 1 為根節(jié)點,以 2 為根節(jié)點,以 3 為根節(jié)點 的不同二叉搜索樹數(shù)量。這就是我們動態(tài)規(guī)劃,主要處理的問題。

  • 以 1 為根節(jié)點 時: 此時其左子樹具有 dp[1-1] 種選擇(左子樹無節(jié)點),右子樹具有 dp[3-1] 種選擇(節(jié)點 2,3)
  • 以 2 為根節(jié)點 時: 此時其左子樹具有 dp[2-1] 種選擇(節(jié)點 1),右子樹具有 dp[3-2] 種選擇(節(jié)點 3)
  • 以 3 為根節(jié)點時: 此時其左子樹具有 dp[3-1] 種選擇(節(jié)點 1,2),右子樹具有 dp[3-3] 中選擇(右子樹無節(jié)點)

因此 最終結(jié)果為

dp[1-1] * dp[3-1] + dp[2-1] * dp[3-2] + dp[3-1] * dp[3-3]

分析完了 n = 3 的情況,下面我們來看一下一般情況:

1. dp數(shù)組以及下標(biāo)的含義:

dp[] 數(shù)組表示二叉搜索樹數(shù)量,下標(biāo) i 表示當(dāng) n = i 時,所含的二叉搜索樹數(shù)量

2. 確定遞推公式:

dp[i] += dp[i-1] * dp[i-j] (其中 1<=j<=i, 表示以 j 為根節(jié)點的二叉搜索樹)

3. dp數(shù)組如何初始化

  • 當(dāng)二叉樹一個節(jié)點都沒有,即 dp[0] 時 ,二叉搜索樹只有一種情況 dp[0] = 1
  • 當(dāng)二叉樹只有一個節(jié)點時,即 dp[1] 時,二叉搜索樹只有一種情況 dp[1] = 1

4. 確定遍歷順序:

節(jié)點數(shù)為 3 的二叉搜索樹種類數(shù),需要用節(jié)點數(shù)為 2 的二叉搜索樹推出,因此順序遍歷 從 3 ~ n 即可

三、代碼

    // 不同的二叉搜索樹
    public int numTrees(int n) {
        int[] dp = new int[n+1];
        dp[0] = 1;
        dp[1] = 1; // 初始化動態(tài)規(guī)劃數(shù)組
        for(int i=2; i<n+1; i++){
            for(int j=1; j<=i; j++){ // 分別以 1 ~ i 為根節(jié)點,計算二叉樹種類數(shù),累加到結(jié)果中
                dp[i] += dp[j-1]*dp[i-j];
            }
        }
        return dp[n];
    }

到此這篇關(guān)于Java動態(tài)規(guī)劃方式解決不同的二叉搜索樹的文章就介紹到這了,更多相關(guān)Java二叉搜索樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java項目中的多線程實踐記錄

    java項目中的多線程實踐記錄

    項目開發(fā)中對于一些數(shù)據(jù)的處理需要用到多線程,比如文件的批量上傳,數(shù)據(jù)庫的分批寫入,大文件的分段下載等,主要涉及到多線程的一些知識,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下
    2021-11-11
  • mybatis-4 mybatis與spring結(jié)合使用及原理解析

    mybatis-4 mybatis與spring結(jié)合使用及原理解析

    本文通過圖文并茂的形式給大家介紹了mybatis-4 mybatis與spring結(jié)合使用及原理解析,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-04-04
  • Idea jdk版本問題解決方案

    Idea jdk版本問題解決方案

    這篇文章主要介紹了Idea jdk版本問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • 自定義指定路由上的Gateway過濾器工廠詳解

    自定義指定路由上的Gateway過濾器工廠詳解

    這篇文章主要介紹了自定義指定路由上的Gateway過濾器工廠詳解,gateway是Spring?Cloud中的一個網(wǎng)關(guān)服務(wù),gateway可以使用服務(wù)注冊中心進(jìn)行服務(wù)發(fā)現(xiàn)和負(fù)載均衡,同時還可以配置斷言來判斷請求是否符合路由規(guī)則,需要的朋友可以參考下
    2023-09-09
  • Java程序員常犯的五個錯誤

    Java程序員常犯的五個錯誤

    這篇文章總結(jié)以前經(jīng)驗針對java編程的一些習(xí)慣,給出一些關(guān)于java編程的建議: 當(dāng)你開始成為一個程序員的時候,在編程的時候很容易陷入下面所述的一些壞習(xí)慣,下面把Java程序員常犯的五個錯誤整理如下,需要的朋友可以參考下
    2015-07-07
  • SpringBoot遠(yuǎn)程訪問redis服務(wù)器問題剖析

    SpringBoot遠(yuǎn)程訪問redis服務(wù)器問題剖析

    使用了SpringBoot的項目,在遠(yuǎn)程連接Redis服務(wù)器時,會遇倒一些小問題,下面通過本文給大家全面解析SpringBoot遠(yuǎn)程訪問redis服務(wù)器問題,需要的朋友參考下吧
    2017-04-04
  • Java實現(xiàn)窗體程序顯示日歷

    Java實現(xiàn)窗體程序顯示日歷

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)窗體程序顯示日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • java判斷域名無法訪問自行訪問下一條

    java判斷域名無法訪問自行訪問下一條

    這篇文章主要為大家介紹了java實現(xiàn)判斷域名無法訪問的時候自行訪問下一條域名示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java實現(xiàn)簡單樹結(jié)構(gòu)

    Java實現(xiàn)簡單樹結(jié)構(gòu)

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)簡單樹結(jié)構(gòu)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • SpringMVC之異常處理解讀

    SpringMVC之異常處理解讀

    這篇文章主要介紹了SpringMVC之異常處理解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論