對於一棵多叉樹,我們可以通過 「左孩子右兄弟」 表示法,將其轉化成一棵二叉樹。
如果我們認為每個結點的子結點是無序的,那麼得到的二叉樹可能不唯一。
換句話說,每個結點可以選任意子結點作為左孩子,並按任意順序連線右兄弟。
給定一棵包含 \(n\) 個結點的多叉樹,結點從 \(1\) 至 \(n\) 編號,其中 \(1\) 號結點是根,每個結點的父結點的編號比自己的編號小。
請你計算其通過 「左孩子右兄弟」 表示法轉化成的二叉樹,高度最高是多少。
注:只有根結點這乙個結點的樹高度為 \(0\)。
例如如下的多叉樹:
可能有以下 3 種 (這裡只列出 3 種,並不是全部) 不同的 「左孩子右兄弟」表示:
其中最後一種高度最高,為 \(4\)。
輸入的第一行包含乙個整數 \(n\)。
以下 \(n−1\) 行,每行包含乙個整數,依次表示 \(2\) 至 \(n\) 號結點的父結點編號。
輸出乙個整數表示答案。
資料範圍
對於 \(30\%\) 的評測用例,\(1≤n≤20\);
對於所有評測用例,\(1≤n≤10^5\)。
輸入樣例:
511
12
輸出樣例:4
dfs左孩子右兄弟表示法:乙個節點的左子樹表示的是原樹中這個節點的子節點,乙個節點的右子樹表示的是這個節點在原樹中的兄弟(父節點相同的點)
所以為了達到一棵樹的最大高度,只需要找出其子樹的最大高度,其餘孩子節點分別作為右子樹(即對應右兄弟),可利用dfs
實現此操作
// problem: 左孩子右兄弟
// contest: acwing
// url:
// memory limit: 256 mb
// time limit: 1000 ms
// // powered by cp editor (
// %%%skyqwq
#include //#define int long long
#define help
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
typedef long long ll;
typedef pairpii;
typedef pairpll;
template bool chkmax(t &x, t y)
template bool chkmin(t &x, t y)
template void inline read(t &x)
while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
x *= f;
}const int n=1e5+5;
int n;
vectoradj[n];
int dfs(int x)
int main()
cout<
return 0;
}
左孩子右兄弟的字典樹
一般寫的字典樹都是雙陣列的形式,但是當字元的數量很多時,就會占用大量的記憶體,初始化操作也會變慢。這時,就可以用左孩子右兄弟的寫法,來以時間換空間。下面是自己寫的乙個 1 include 2 include 3 include 4 5using namespace std 67 const int ...
左孩子右兄弟表示法的任意有根樹的遍歷
演算法導論 p.248 10.4 4題目描述 對於乙個含n個結點的任意有根樹,寫出乙個o n 時間的過程,輸出其所有關鍵字,該樹以左孩子右兄弟表示法儲存。與二叉樹的遍歷類似 class tree def init self,val self.val val self.left child none ...
把二叉樹轉變為左孩子右兄弟樹
erchatoshu.cpp 定義控制台應用程式的入口點。include stdafx.h include includeusing namespace std 二叉樹節點結構 typedef struct treenode position typedef struct treenode sear...