1. 程式人生 > >普通樹轉二叉樹:左兒子右兄弟表示法

普通樹轉二叉樹:左兒子右兄弟表示法

  這兩天在吃力地學DP的優化,被虐地不行不行的。搞個小插曲。

  左兒子右兄弟,顧名思義,是一棵轉換後的樹,它是一棵二叉樹,一個節點的左子樹表示的是原樹中這個節點的子節點,一個節點的右子樹表示的是這個節點在原樹中的兄弟(父節點相同的點)。

  這麼表示有什麼好處呢?在DP時二叉樹的優勢相比於普通樹是很明顯的,或許有時它不能優化時間,但至少可以優化“思路”。

  最近並沒有碰到要轉二叉樹的題,也沒什麼題解可寫,等碰到了再補充吧,現在先把模板貼在這裡嘍。直接遞迴建樹即可,原樹是用vector儲存的。

void dfs(int u){
	if(!u || !G[u].size()) return;
	lc[u] = G[u][0];
	dfs(lc[u]);
	int v = lc[u];
	for(int i = 1; i < G[u].size(); i++){
		rc[v] = G[u][i];
		dfs(rc[v]);
		v = rc[v];
	}
}