3422 左孩子右兄弟

2022-09-22 05:00:12 字數 1834 閱讀 2857

對於一棵多叉樹,我們可以通過 「左孩子右兄弟」 表示法,將其轉化成一棵二叉樹。

如果我們認為每個結點的子結點是無序的,那麼得到的二叉樹可能不唯一。

換句話說,每個結點可以選任意子結點作為左孩子,並按任意順序連線右兄弟。

給定一棵包含 \(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...