NOIP2018普及組複賽試題第4題解析

2021-09-24 20:37:04 字數 2412 閱讀 5282

第4題:對稱二叉樹

題目描述

一棵有點權的有根樹如果滿足以下條件,則被軒軒稱為對稱二叉樹:

二叉樹;

將這棵樹所有節點的左右子樹交換,新樹和原樹對應位置的結構相同且點權相等。

下圖中節點內的數字為權值,節點外的 id表示節點編號。

現在給出一棵二叉樹,希望你找出它的一棵子樹,該子樹為對稱二叉樹,且節點數 最多。請輸出這棵子樹的節點數。

注意:只有樹根的樹也是對稱二叉樹。本題中約定,以節點 t為子樹根的一棵「子 樹」指的是:節點t和它的全部後代節點構成的二叉樹。

輸入輸出格式

輸入格式:

第一行乙個正整數 n,表示給定的樹的節點的數目,規定節點編號1∼n,其中節點 1 是樹根。

第二行 n個正整數,用乙個空格分隔,第 i個正整數 v_i 代表節點 i 的權值。

接下來 n 行,每行兩個正整數 l_i, r_i,分別表示節點 ii 的左右孩子的編號。如果不存在左 / 右孩子,則以 -1表示。兩個數之間用乙個空格隔開。

輸出格式:

輸出檔案共一行,包含乙個整數,表示給定的樹的最大對稱二叉子樹的節點數。

輸入輸出樣例

輸入樣例#1:

21 3

2 -1

-1 -1

輸出樣例#1:

1輸入樣例#2:

102 2 5 5 5 5 4 4 2 3

9 10

-1 -1

-1 -1

-1 -1

-1 -1

-1 2

3 45 6

-1 -1

7 8輸出樣例#2:3說明

【輸入輸出樣例 1 說明】

最大的對稱二叉子樹為以節點2為樹根的子樹,節點數為1。

【輸入輸出樣例 2 說明】

最大的對稱二叉子樹為以節點7為樹根的子樹,節點數為3。

a,l,r:array[1..1000000]of longint;

n,i,x,max:longint;

function dfs(x,y:longint):longint;//比較兩顆子樹是否對稱並累計節點數量

var t:longint;

begin

if (a[x]<>a[y]) or ((l[x]>0)<>(r[y]>0)) or ((l[y]>0)<>(r[x]>0)) then//如果兩顆子樹的根的權值不一樣或者結構不一樣

exit(0); //不對,退出

dfs:=2;

if l[x]>0 then //如果有左子樹的左子樹的話(也就是有右子樹的右子樹)

begin

t:=dfs(l[x],r[y]); //比較左子樹的左子樹和右子樹的右子樹

if t=0 then //如果不對

exit(0); //不對,退出

inc(dfs,t); //累計節點數量

end;

if l[y]>0 then //基本同上

begin

t:=dfs(l[y],r[x]); //比較左子樹的右子樹和右子樹的左子樹

if t=0 then

exit(0);

inc(dfs,t);

end;

end;

function f(x:longint):longint; //計算以x為根的對稱二叉樹的節點數量

begin

if (l[x]=-1) and (r[x]=-1) then//如果是葉子節點

exit(1) //不用搜了,反正就乙個根節點

else

if (l[x]=-1) or (r[x]=-1) then//如果有左子樹沒右子樹或者有右子樹沒左子樹

exit(0) //不對稱,返回0

else

exit(dfs(l[x],r[x])+1); //比較左子樹和右子樹,再加上根節點(如果不對稱就返回1,不過並沒有什麼關係)

end;

begin

read(n);

for i:=1 to n do //讀入

read(a[i]);

for i:=1 to n do

read(l[i],r[i]);

max:=0;

for i:=1 to n do //列舉對稱二叉樹的根節點

begin

x:=f(i);

if x>max then

max:=x;

end;

writeln(max);

end.

NOIP2018普及組複賽解析

輸入乙個字串,求字串除了空格的字元個數 這種考你會不會程式設計的題不會?include include include using namespace std int ans string c intmain 乙個長度為n序列,被中間點m分成兩半,m左邊和m右邊。左邊戰鬥力為 i 1m 1 m i ...

NOIP2018普及組 參賽總結

發現就我只打了這麼一點字,所以再重新發一下 考前 考試前一天晚上一直在看電視 看到了10點還是11點吧,寫了一會兒會兒作業,但我覺得這不是考砸了的理由 誰叫我本來就如此之水 第二天早上很早就起床了,還順便跟外婆還有老媽去小區外面吃了個早餐。然後老媽帶我來了考場,也是在附近萬達吃了飯,走路就花了我差不...

NOIP2018普及組 標題統計

題目大意 凱凱剛寫了一篇美妙的作文,請問這篇作文的標題中有多少個字元?注意 標題中可能包含大 小寫英文本母 數字字元 空格和換行符。統計標題字 符數時,空格和換行符不計算在內。評測位址 本題考察知識點 c 字元及字串讀入方式,cin,getline,scanf,getchar 的使用等 演算法分析 ...