label: dp+lnr,深拷貝,遞迴左右劃分構建樹
給定乙個整數 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 2
/ / \ \
2 1 2 3
分析:
首先初始化dp,構建dp[0],dp[1],這些主要是用來構建各中情況的樹的結構,隨後計算直接將dp加入到left,right,這樣就利用到了子結構;但是,題目要求不僅是樹的結構,還要求樹上的節點元素值也匹配,觀察樣例,就是lnr,顧又寫了乙個lnr更新節點;之後發現要輸出所有情況,但怎麼一致不是lnr的狀態,原因在於利用子結構dp中的記錄,是相同的資料,並且用指標引用了,所以lnr不僅要做更新資料,還要做重新建立樹的各節點,即深拷貝。( 一開始沒有使用深拷貝,導致後邊改了前邊亂,左後統一進行了深拷貝)。
直接遞迴的辦法,將陣列劃分成左右兩部分,左邊即左子樹,右邊即右子樹,遞迴下去就是題目所要求的內容,但是比較費時。
dp:
package main
import
"fmt"
//若求數量,則很簡單,dp合起來就行
func
generatetreespre
(n int
)int
}return dp[n]
}type treenode struct
/*執行用時 :56 ms, 在所有 go 提交中擊敗了45.24%的使用者
記憶體消耗 :12.5 mb, 在所有 go 提交中擊敗了80.77%的使用者
*///但是它要你輸出所有的情況,而且不僅僅是樹的結構,還嚴格要求了節點上的數字,是有序數字中心遍歷的狀態
func
generatetrees
(n int)[
]*treenode
for i:=
1;i<=n;i++)}
iflen
(dp[i-
1-j])==
0)}}
for m:=0;
len(dp[j])==
0&&m<
len(dp[i-
1-j]
);m++)}
iflen
(dp[j])==
0&&len(dp[i-
1-j])==
0)}}
}for i:=
0;i<
len(dp[n]
);i++
return dp[n]
}//lnr,深拷貝
var idx=
0func
lnr(root*treenode)
*treenode
l:=lnr(root.left)
idx+=
1 val:=idx
r:=lnr(root.right)
root=
&treenode
return root
}//show
func
show
(root *treenode)
fmt.
print
(root.val,
",")
if(root.right==
nil&&root.left!=
nil)
||(root.right!=
nil&&root.left==
nil)
show
(root.left)
show
(root.right)
}func
main()
for_
,v:=
range tables
}}
遞迴:
/*
執行用時 :72 ms, 在所有 go 提交中擊敗了11.90%的使用者
記憶體消耗 :34.3 mb, 在所有 go 提交中擊敗了7.69%的使用者
*/func
deepcopy
(root*treenode)
*treenode
l:=deepcopy
(root.left)
r:=deepcopy
(root.right)
return
&treenode
}func
build
(a,b int)[
]*treenode,}
}else
if a>b
ts:=
make([
]*treenode,0)
for i:=a;i<=b;i++)}
iflen
(rs)==0
)}}for k:=0;
len(ls)==0
&&k<
len(rs)
;k++)}
}return ts
}func
generatetrees
(n int)[
]*treenode
95 不同的二叉搜尋樹
題目 給定乙個整數 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...
95 不同的二叉搜尋樹
給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3 使用dp n 表示1 n可以用多少顆不同的二叉搜尋樹,那麼 dp 0 1 假設空樹也是一顆樹 ...
95 不同的二叉搜尋樹 II
二叉搜尋樹,又被稱為是二叉查詢樹 二叉排序樹,這種樹其左子樹所有節點的值均小於根節點的值,其右子樹所有節點的值均大於根節點的值,並且其左 右子樹均為二叉搜尋樹。空樹也是二叉搜尋樹。方法一 遞迴法 與這道題類似的是那道 96不同的二叉搜尋樹 在96中我們曾分析到,由於給定的節點值為1 n,是一組從小到...