樹形dp套路

2022-09-08 19:36:08 字數 3794 閱讀 6596

我們知道dp也就是動態規劃的思想就是先解決小問題,通過不斷的解決小問題,最終解決大問題。那麼能夠應用樹形dp套路的題目都應該符合乙個條件,那就是通過解決每個子樹的小問題,最終解決整棵樹的大問題。

分析有幾種可能

需要哪些資訊

彙總資訊,構造returntype

構造遞迴函式

首先,這道題是可以通過先解決小的子樹最大搜尋二叉子樹,然後不斷擴大範圍,最終解決整棵樹的最大搜尋二叉子樹。

那麼分析套路開始:

分析有哪些情況?

第一:最大搜尋二叉子樹在左子樹中

第二:最大搜尋二叉子樹在右子樹中

第三:整顆左子樹+頭結點+整顆右子樹,是乙個搜尋二叉樹

需要哪些資訊?

maxbsthead最大搜尋二叉子樹的頭結點,我們需要返回他

maxbstsize最大搜尋二叉子樹的大小,我們需要跟其他搜尋二叉樹比較

左子樹的最大值,我們需要這個值跟頭結點比較

右子樹的最小值,我們需要這個值跟頭結點比較

合併資訊到returntype

構造遞迴函式

首先返回值是returntype,引數為node,不多說。終止條件仍然要返回乙個returntype。對於這種套路都是先左右遞迴,然後根據各種情況為returntype的屬性賦值。

/**

* 找到二叉樹中的最大搜尋二叉子樹

* * @author keboom

* @date 2021/5/9

*/public class findlargesttree

}public returntype process(node x)

// 預設直接得到左樹全部資訊

returntype ldata = process(x.left);

// 預設直接得到右樹全部資訊

returntype rdata = process(x.right);

// 資訊整合

// 求最小值:x,左子樹,右子樹

int min = math.min(x.value, math.min(ldata.min, rdata.min));

// 求最大值:x,左子樹,右子樹

int max = math.max(x.value, math.max(ldata.max, rdata.max));

// 如果只考慮可能性一和二,也就是最大搜尋二叉樹是x的左子樹或者右子樹

int maxbstsize = math.max(ldata.maxbstsize, rdata.maxbstsize);

// 如果只考慮可能性一和二,也就是最大搜尋二叉樹是x的左子樹或者右子樹

node maxbsthead = ldata.maxbstsize >= rdata.maxbstsize ? ldata.maxbsthead : rdata.maxbsthead;

// 利用收集的資訊,可以判斷是否存在第三種可能

if (ldata.maxbsthead == x.left && rdata.maxbsthead == x.right

&& x.value > ldata.max && x.value < rdata.min)

return new returntype(maxbsthead, maxbstsize, min, max);

}public node getmaxbst(node head)

}

有哪些情況?

就那一種情況,那就是左樹,右樹都是平衡二叉樹,並且高度差小於等於1

需要哪些資訊?

高度,該樹是否為平衡

綜合資訊到returntype

構造遞迴函式

返回值,引數,終止條件不多說了。同樣的格式,先是左右遞迴,然後操作之。我們需要求returntype的屬性值,對於樹高來說,去左子樹和右子樹中大的+1即可。對於是否平衡,那麼就要求左樹和右樹都平衡,且高度差小於等於1。

/**

* @author keboom

* @date 2021/5/17

*/public class isbalancetree

}public boolean isbalanced(node head)

private returntype process(node head)

returntype leftdata = process(head.left);

returntype rightdata = process(head.right);

int height = math.max(leftdata.height, rightdata.height) + 1;

boolean isbalanced = leftdata.isbalanced && rightdata.isbalanced

&& math.abs(leftdata.height - rightdata.height) < 2;

return new returntype(isbalanced, height);}}

這題要求從乙個二叉樹中,我找兩個距離最遠的點,求最遠距離是多少?

這棵樹找4和6,距離就是最大的5。當然了找4和7,5和6,5和7都是一樣的。

打馬賽克的是沒有了哦

樹形DP 樹形DP四例

是時候練一下dp了!我的題單 portkey f u,if fu,i 表示以u uu為根節點的子樹中保留i ii條樹枝的最大蘋果數 f u,i max f max f fu,i max這些題是菜,但也不能輕視啊!include using namespace std define in read i...

HLOJ 樹形DP前置 DFS(樹形DP入門)

給定一棵 n nn 個點的樹,根為 t tt求每個點的父親是哪個點,t tt 的父親輸出 0 00第一行兩個整數 n,t n,tn,t接下來 n 1 n 1n 1 行,每行兩個整數 x,y x,yx,y,表示 x,y x,yx,y 之間有一條邊 n nn 行,第 i ii 行乙個整數,表示 i ii...

樹形dp小結

這些天做了一些樹形dp的題目,感覺有了些領悟,尤其是理解到樹形揹包就是分組揹包之後。選出幾道不錯的總結一下 hdu 1520 hdu 4003 poj 1155 poj 2486 hdu 4313 hdu 4340 hdu 1520 入門水題 每個節點有權值,子節點和父節點不能同時選,問最後能選的最...