今天覆習樹形dp時發現一道比較古老的題,叫選課,是樹形dp的一道基礎題,也是多叉樹轉二叉樹應用的模版題
多叉樹轉二叉樹的應用非常廣泛,因為如果乙個節點的兒子太多,乙個乙個存下來不方便去查詢,並且會增加複雜度,但是這裡我們就有乙個o(n)的複雜度的方法把多叉樹轉換為二叉樹,轉換成二叉樹後就更方便查詢,因為每個節點最多就兩個兒子節點,減少了複雜度並且讓**實現起來更容易
多叉樹轉二叉樹圖示:
在這張圖中,右邊那棵二叉樹由左邊的多叉樹轉換而來,並且這棵二叉樹是豎著相連的是父子關係,橫著相連的是兄弟關係,也就是左兒子,右兄弟
接著就是**實現了,其實**實現也有一些小小的技巧
比如我們要求輸入a,b表示a是b的兒子
例子: 2 1
4 13 1
如果我們按著順序處理,那1的左兒子就是2,2的右兒子是4,4的右兒子是3,但是這樣的話會有一點的麻煩,所以我們就不斷的變更
方法:1的左兒子是2,讀入第二行,4的右兒子就是當前1的左兒子節點2,然後1的左兒子變成4,讀入第三行,3的右兒子是節點4,然後1的左兒子變成3
這種方法在**上更加容易實現並且複雜度也要小一些
轉換成**就是
1view codefor(int i=1;i<=n;i++)
2
多叉樹轉二叉樹
多叉樹的根結點為二叉樹的根,多叉樹的結點的第乙個兒子變成二叉樹對應結點的左孩子,多叉樹的結點的右兄弟變成二叉樹種該結點的右孩子。如下 c語言 01 include 02 include 03 include 04 include 0506 typedef struct treenode treeno...
束縛二叉樹 樹形dp
乙個子樹內的前序遍歷序是連續的,於是可以設 f i j f i,j f i,j 表示以 i ii 為根的子樹,子樹末節點編號為 j jj 時的方案數,狀 態轉 移 f i,j k ijf i,k f k 1,j 狀態轉移 f i,j sum limits f i,k times f k 1,j 狀態...
束縛二叉樹 樹形dp
乙個子樹內的前序遍歷序是連續的,於是可以設 f i j f i,j 表示以 i i 為根的子樹,子樹末節點編號為 j j 時的方案數,狀態 轉移 f i,j k ijf i,k f k 1,j 狀態 轉移 f i,j k i j f i,k f k 1 j 考慮怎麼滿足題目的限制條件,設左子樹的中序...