我們知道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 入門水題 每個節點有權值,子節點和父節點不能同時選,問最後能選的最...