二叉搜尋樹的動態規劃(樹形DP)

2021-09-26 08:43:46 字數 1551 閱讀 2444

leetcode96

給定乙個整數 n,求以 1 ... n 為節點組成的二叉搜尋樹有多少種?(注意是二叉搜尋樹)

示例:   輸入: 3          輸出: 5

解釋:給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹:

1         3     3      2      1

\       /     /      / \      \

3     2     1      1   3      2

/     /       \                 \

2     1         2                 3

思路:用乙個陣列來儲存n之前每個結點能構成的不同二叉樹種數。在求n的時候,依次以1,2,3.....n作為根,假設n為6,在以3作為根時,它的左子樹只能是1和2,右子樹只能是4,5和6,左子樹能構成的種數已知為dp[2],右子樹的結構和1,2,3相同,它能構成的種數與dp[3]相同。因此最終答案就dp[2]*dp[3]!

class solution 

}return dp[n];

}}

leetcode95

給定乙個整數 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

思路與上題類似

class solution 

res[0].add(null);

res[1] = new arraylist<>();

res[1].add(new treenode(1));

//求n的時候,先求出1到n-1的結果

for(int i=2;i<=n;i++)}}

}return res[n];

}public treenode clone(treenode root,int offset)

treenode node = new treenode(root.val + offset);

node.left = clone(root.left,offset);

node.right = clone(root.right,offset);

return node;

}}

動態規劃 最優二叉搜尋樹

動態規劃與分治方法類似,都是通過組合子問題來求解原問題。通常用來求解最優化問題,通常按如下4個步驟設計乙個動態規劃演算法 1.刻畫乙個最優解的結構特徵 2.遞迴的定義最優解的值 3.採用自底向上的方法計算最優解的值 4.利用計算出的資訊構造乙個最優解。二叉搜尋樹 optimal binary sea...

最優二叉搜尋樹動態規劃

最優二叉搜尋樹問題是對於有序集s及其訪問概率或權值 q0,p1,q1,p2,q2,p3,q3 在所有表示有序集s的二叉搜尋樹中找出一顆具有最小平均路長的二叉搜尋樹。解決方法 使用動態規劃方法自底向上逐步構造最優二叉搜尋樹。動態規劃的兩個重要要素是 1 最優子結構。2 重疊子問題。1 所謂最優化子結構...

動態規劃最優二叉搜尋樹

前面的optimal bst還能寫出來,要去construct就不會了,也是理解不夠深刻的原因吧。以下 的construct用了兩種方法,參照了兩位博主,前乙個 風格非常暴力,能看懂以後寫不出來系列。第二種的d的輸出那我沒有看出邏輯,好像是用的輸出的相鄰兩個下標是在同乙個節點上連著?這個的理由我沒想...