95 不同的二叉搜尋樹 II M

2021-09-25 05:14:22 字數 2843 閱讀 2390

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,是一組從小到...