二叉搜尋樹有以下幾個特點:
(1)、左邊的小於當前;
(2)、右邊的大於當前;
(3)、沒有重複的值。
為了符合二叉搜尋樹的這幾個特點,我們需要知道當前的範圍。(要知道開頭和結尾;最開始是1和n)
1、首先定義乙個字典儲存已遍歷的引數和結果以免重複。
2、特殊情況判斷:如果n == 0,返回,如果不判斷則會返回[none](執行遞迴**會直接返回,因為0<1)。
3、遞迴終止條件:
如果left>right則返回[none]。
以前已經遍歷過當前節點則可以直接返回以前的結果。
當前的值可能是left……right,所以我們要把每乙個都試一遍,每次迴圈都要這麼做:
遞迴得到左和右,將返回列表增加它們的全部組合。(值:當前迴圈變數,左:當前左,右:當前右)
將元組(left,right)作為鍵,返回列表為值加入字典,然後返回。
**
class
solution
:def
generatetrees
(self, n:
int)
-> list[treenode]
:if n ==0:
return
dct =
defleft_right
(left:
int, right:
int)
-> list[treenode]
:if left > right:
return
[none]if
(left, right)
in dct:
return dct[
(left, right)
] ret =
for i in
range
(left, right+1)
: left_lst = left_right(left, i-1)
right_lst = left_right(i+
1, right)
for l in left_lst:
for r in right_lst:
dct[
(left, right)
]= ret
return ret
left_right(
1, n)
return left_right(
1, n)
力扣每日一題 二叉樹的最小深度
原題鏈結 題目描述 給定乙個二叉樹,找出其最小深度。最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。說明 葉子節點是指沒有子節點的節點。示例 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回它的最小深度 2.解題思路 dfs即可,只不過注意一下測試用例 1,...
力扣95不同的二叉搜尋樹
自上向下遞迴下去找到所有的樹比較容易,難得是如何如何從下往上返回來把每一棵樹都列印出來,class solution return getans 1,n private vectorgetans int start,int end if start end for int i start i end...
力扣96 不同的二叉搜尋樹
給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3 原題url 這道題看到的第一眼,就和之前的格雷編碼一樣,又想用動態規劃,每次都是遍歷所有情況去...