LintCode刷題 不同的二叉查詢樹I II

2022-08-10 20:27:07 字數 1889 閱讀 4765

不同的二叉查詢樹i:

題目內容:

給出 n,問由 1...n 為節點組成的不同的二叉查詢樹有多少種?

樣例:給出n = 3,有5種不同形態的二叉查詢樹:

1           3    3       2      1

\ / / / \ \

3 2 1 1 3 2

/ / \ \

2 1 2 3

演算法分析:

先來看一下二叉查詢樹的特點,當選定乙個節點i作為中間節點時:

①位於該節點左子樹中的所有節點均小於i,假設該節點的左子樹的排列情況有m種;

②位於該節點右子樹中的所有節點均大於i,假設該節點的右子樹的排列情況有n種;

③綜合①和②,當節點i作為當前二叉查詢樹的首節點時,該二叉查詢樹的總排列數目有m*n;

因此對於乙個擁有n個節點的二叉查詢樹,其每乙個節點均能成為某一二叉查詢樹的首節點,因此動態規劃的表示式為:

dp[i] = sum,其中1=< j <=i,dp[i]表示i個節點所能組成的二叉查詢樹的數目;

**: 

public

int numtrees(int

n) }

return

result[n];

}

不同的二叉查詢樹ii:

題目內容:

給出n,生成所有由1...n為節點組成的不同的二叉查詢樹;

樣例:給出n = 3,有5種不同形態的二叉查詢樹:

1           3    3       2      1

\ / / / \ \

3 2 1 1 3 2

/ / \ \

2 1 2 3

演算法分析:

本題在 i 的基礎上要求返回的不是組數而是具體的組合,很明顯本題需要用遞迴的方式來解決問題,和 i 的思想基本一致,在遞迴的過程中找出所有的左右子樹的排列組合,然後分別連線到當前節點的左子樹和右子樹,將結果作為當前層的二叉查詢樹的所有排列組合進行返回。

**:

hashmap> map = new hashmap<>();

public listfindsolution(int begin, int

end)

if(begin==end)

string tag = string.valueof(begin)+"-"+string.valueof(end);

if(map.get(tag)!=null

)

for(int i=begin;i<=end;i++)}}

if(left.size()!=0&&right.size()==0)

}if(left.size()==0&&right.size()!=0)}}

map.put(tag,result);

return

result;

}public listgeneratetrees(int

n)

**中我還建立了乙個map作為中間結果的記錄,用來降低一些重複區間段求解的時間開銷,其效果還是很明顯的,當n=11時,沒有map的演算法時間開銷為124313992ns,而有map的演算法時間開銷為82106610ns;但是這題我我試了下即使不用map也能夠ac;

LintCode 不同的二叉查詢樹

給出 n,問由 1 n 為節點組成的不同的二叉查詢樹有多少種?給出n 3,有5種不同形態的二叉查詢樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3solution 對於該問題我們可以使用動態規劃來求解。對於動態規劃問題我們需要確定問題的狀態和狀態轉換方程。首先我們來確定問題的狀態 給定...

每日刷題 不同的二叉搜尋樹II

給定乙個整數 n,生成所有由 1 n 為節點所組成的二叉搜尋樹。示例 輸入 3 輸出 1,null,3,2 3,2,null,1 3,1,null,null,2 2,1,3 1,null,2,null,3 解釋 以上的輸出對應以下 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 ...

lintcode 不同的二叉樹II

解法思路 要生成所有情況的二叉樹,首先肯定能想到遍歷所有的數作為頭結點的情況,構建頭結點的左右子樹的過程可以利用遞迴完成。此處難點應該在於 1 同乙個數作為頭結點時,子樹可以有不同的結構 2 當前樹已經構造完成,應該將頭結點加入到結果vector中。此處的解決辦法 遞迴的正常解法,從上往下遞迴,從下...