日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第十二届蓝桥杯真题-左孩 子右兄弟(dfs)

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第十二届蓝桥杯真题-左孩 子右兄弟(dfs) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述
對于一棵多叉樹,我們可以通過 “左孩子右兄弟” 表示法,將其轉化成一棵
二叉樹。
如果我們認為每個結點的子結點是無序的,那么得到的二叉樹可能不唯一。換句話說,每個結點可以選任意子結點作為左孩子,并按任意順序連接右兄弟。
給定一棵包含 N 個結點的多叉樹,結點從 1 至 N 編號,其中 1 號結點是根,每個結點的父結點的編號比自己的編號小。請你計算其通過 “左孩子右兄弟” 表示法轉化成的二叉樹,高度最高是多少。注:只有根結點這一個結點的樹高度為 0 。
例如如下的多叉樹:

可能有以下 3 種 (這里只列出 3 種,并不是全部) 不同的 “左孩子右兄弟”
表示:

其中最后一種高度最高,為 4。

輸入
輸入的第一行包含一個整數 N。
以下 N 1 行,每行包含一個整數,依次表示 2 至 N 號結點的父結點編號。

輸出
輸出一個整數表示答案。

樣例輸入

5 1 1 1 2

樣例輸出

4

思路
一開始沒有看懂這個題的意思,后來發現這個題應該是說把多叉樹轉化成2叉樹的形式,多的兄弟節點就轉化成子節點,然后求最高的高度。

第一想法就是把這顆樹接成只有一個字節點的樹,把其他的兄弟節點都連成子節點,那么對于這種方案,高度最高的子節點就應該連在最底下,使高度最大化,那么其他的子節點就只能貢獻一層的高度了,所以我們使用dfs先求出每個節點的最大轉化高度,然后以最高的子節點在最下,返回子節點數+最大子節點高度即可!

我們可以拿樣例圖的最后一個方案來解釋,1號節點有3個子節點,其中2節點是最高的,那么把它放在最底下,所以3,4號子節點就只能本身可以充當一層高度,和它們的子節點無關,那么我們就可以返回1號子節點的個數3+最高的子節點高度2,又因為根節點的高度是0,所以減一得到正確答案

代碼

#include "iostream" #include "vector" using namespace std; const int N=100010; vector<int> v[N]; int n,x; int dfs(int u) {if(v[u].size()==0) return 1;int res=0;for(int i=0;i<v[u].size();i++){res=max(res,dfs(v[u][i])); //獲取最大子節點的高度}return v[u].size()+res; //這里最高的子節點會被加2次,但是沒有加根節點的高度,所以兩者抵消 } int main() {cin>>n;for(int i=2;i<=n;i++){cin>>x;v[x].push_back(i);}cout<<dfs(1)-1<<endl; //這里由于根節點沒有高度,所以要減一了 }

總結

以上是生活随笔為你收集整理的第十二届蓝桥杯真题-左孩 子右兄弟(dfs)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。