第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 的使用等 演算法分析 ...