摘要:而根可以選擇從到的任意的數(shù),唯一二叉樹的總數(shù),就是根為到的樹相加。所以該問題化簡為以為根,其唯一左子樹和右子樹各有多少,這就是個動態(tài)規(guī)劃的問題了。
Unique Binary Search Trees I && II 解法請見:https://yanjia.li/zh/2019/02/...
動態(tài)規(guī)劃 復(fù)雜度Given n, how many structurally unique BST"s (binary search trees) that store values 1...n?
For example, Given n = 3, there are a total of 5 unique BST"s.
1 3 3 2 1 / / / 3 2 1 1 3 2 / / 2 1 2 3
時間 O(N!) 空間 O(N)
思路二叉搜索樹有個性質(zhì),就是左邊的數(shù)都比根小,右邊的數(shù)都比根大。另外,題目說明二叉樹的節(jié)點(diǎn)是從1到n,所以我們能確定如果根為k,則根左邊的數(shù)是1到k-1,根右邊的數(shù)是k+1到n。還有一點(diǎn)技巧是,對于通過一個根來說,唯一二叉樹的數(shù)量是其左子樹的數(shù)量乘以右子樹的數(shù)量,這是簡單的乘法原理。并且,左右子樹的形態(tài)數(shù)量是跟具體的數(shù)無關(guān)的,只跟這個樹里有多少節(jié)點(diǎn)有關(guān)。而根可以選擇從1到n的任意的數(shù),唯一二叉樹的總數(shù),就是根為1到n的樹相加。所以該問題化簡為以k為根,其唯一左子樹和右子樹各有多少,這就是個動態(tài)規(guī)劃的問題了。我們建立一個數(shù)組dp[i],代表節(jié)點(diǎn)數(shù)為i的唯一子樹有多少個。顯然dp[0]=dp[1]=1。
代碼public class Solution { public int numTrees(int n) { int[] dp = new int[n + 1]; dp[0] = dp[1] = 1; //從節(jié)點(diǎn)數(shù)2開始計(jì)算到節(jié)點(diǎn)數(shù)為n的BST for(int i = 2; i < n + 1; i++){ //計(jì)算根是第一個數(shù)的BST數(shù)量,直到根是最后一個數(shù)的BST數(shù)量,這里j可以理解為根左邊的節(jié)點(diǎn)數(shù) for(int j = 0; j < i; j++){ //有n的節(jié)點(diǎn)的BST一共有 G(n)=F(1,n-1)+F(2,n-1)+...+F(n-1,n-1)個 //以i為根總共n個節(jié)點(diǎn)的BST有 F(i,n)=G(i-1)*G(i+1->n)個 //BST形態(tài)數(shù)量之和一共有多少個節(jié)點(diǎn)有關(guān) G(i+1->n)=G(n-i) //所以G(n)= G(0)*G(n-1)+G(1)*G(n-2)+... dp[i] += dp[j] * dp[i - j - 1]; } } return dp[n]; } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64611.html
摘要:在這里我們使用數(shù)組中下標(biāo)為的位置來記錄個元素可以組成的平衡二叉樹的數(shù)量。在遞歸的過程中,我們找到以當(dāng)前節(jié)點(diǎn)作為根節(jié)點(diǎn)的所有平衡二叉樹,并將結(jié)果以形式返回上一級調(diào)用。 題目要求 Given n, how many structurally unique BSTs (binary search trees) that store values 1...n? For example, Gi...
Unique Binary Search TreesGiven n, how many structurally unique BSTs (binary search trees) that store values 1...n? For example,Given n = 3, there are a total of 5 unique BSTs. 1 3 3 ...
摘要:在線網(wǎng)站地址我的微信公眾號完整題目列表從年月日起,每天更新一題,順序從易到難,目前已更新個題。這是項(xiàng)目地址歡迎一起交流學(xué)習(xí)。 這篇文章記錄我練習(xí)的 LeetCode 題目,語言 JavaScript。 在線網(wǎng)站:https://cattle.w3fun.com GitHub 地址:https://github.com/swpuLeo/ca...我的微信公眾號: showImg(htt...
摘要:注意這里的結(jié)構(gòu)和不同的二叉樹遍歷一樣,如果到空節(jié)點(diǎn)就返回,否則遞歸遍歷左節(jié)點(diǎn)和右節(jié)點(diǎn)。唯一不同是加入了和,所以要在遞歸之前先判斷是否符合和的條件。代碼如果該節(jié)點(diǎn)大于上限返回假如果該節(jié)點(diǎn)小于下限返回假遞歸判斷左子樹和右子樹 Validate Binary Search Tree Given a binary tree, determine if it is a valid binary...
摘要:小鹿題目驗(yàn)證二叉搜索樹給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。假設(shè)一個二叉搜索樹具有如下特征節(jié)點(diǎn)的左子樹只包含小于當(dāng)前節(jié)點(diǎn)的數(shù)。所有左子樹和右子樹自身必須也是二叉搜索樹。算法思路定義全局的變量,用來返回是否為二叉搜索樹。 Time:2019/4/24Title: Vaildata Binary Search TreeDifficulty: MediumAuthor: 小鹿 ...
閱讀 1591·2021-11-23 10:01
閱讀 2981·2021-11-19 09:40
閱讀 3230·2021-10-18 13:24
閱讀 3483·2019-08-29 14:20
閱讀 2992·2019-08-26 13:39
閱讀 1285·2019-08-26 11:56
閱讀 2678·2019-08-23 18:03
閱讀 386·2019-08-23 15:35