前言:
剛剛參加完csp2020的初賽...
..直接崩潰,感覺普及提高都進不了,頹廢了來刷刷題,打了半天才打出這道題,心態炸了...
..
一棵有點權的有根樹如果滿足以下條件,則被軒軒稱為對稱二叉樹:
二叉樹;
將這棵樹所有節點的左右子樹交換,新樹和原樹對應位置的結構相同且點權相等。
現在給出一棵二叉樹,希望你找出它的一棵子樹,該子樹為對稱二叉樹,且節點數最多。請輸出這棵子樹的節點數。
注意:只有樹根的樹也是對稱二叉樹。本題中約定,以節點t
tt為子樹根的一棵「子樹」指的是:節點t
tt和它的全部後代節點構成的二叉樹。
第一行乙個正整數 n(n
≤106
)n(n \le 10^6)
n(n≤10
6),表示給定的樹的節點的數目,規定節點編號 1∼n
1 \sim n
1∼n,其中節點 1
11是樹根。
第二行 n
nn 個正整數,用乙個空格分隔,第 i
ii 個正整數 vi(
vi
≤1000
)v_i(v_i \le 1000 )
vi(vi
≤10
00) 代表節點 i
ii 的權值。
接下來 n
nn 行,每行兩個正整數 li,
ri
l_i, r_i
li,ri
,分別表示節點 i
ii 的左右孩子的編號。如果不存在左 / 右孩子,則以 −1−1
−1表示。兩個數之間用乙個空格隔開。
共一行,包含乙個整數,表示給定的樹的最大對稱二叉子樹的節點數。
213
2-1-
1-1
1
1022
5555
4423
910-1
-1-1
-1-1
-1-1
-1-1
2345
6-1-
178
3
這道題其實挺水的,看遍歷年的普及組第四題這題算簡單了,noi
p2018t3
noip2018t3
noip20
18t3
都比這題難…
好了不多瞎扯了,開始講題:
這是道不用多少技巧的暴力就能過的題,我們觀察到,其實這道題的難點就在於你如何去判斷這是一顆對稱二叉樹,我們很容易就能想到:
左右子節點的子樹大小不一樣的時候肯定不是對稱二叉樹
左右子節點的權值不一樣的時候肯定不是對稱二叉樹
那麼問題來了,上述方法只能解決根節點及其左右兩個子兒子,那麼子兒子的子兒子怎麼辦?當然是遞迴啦!如果上述兩個條件都滿足,那麼我們就比較一下左兒子的左子節點和右兒子的右子節點是否滿足,左兒子的右子節點和右兒子的左子節點是否滿足…這樣一直遞迴下去,如果最終發現全部符合,那麼我們就更新答案就可以了,具體細節見**注釋
獻上蒟蒻的醜**al
ao
dalao
dalao指點
#include
using
namespace std;
const
int maxn=
1e6+5;
inline
intread()
while
(isdigit
(ch)
)return x*f;
}//快讀
int a[maxn]
,vec[maxn][2
],sum[maxn]
;//a[i]用來記錄節點的權值
//vec[x][0]表示根節點為x的左兒子
//vec[x][1]表示根節點為x的右兒子
//sum[i]表示根節點為i的樹的節點數(包括根)
int n,ans=1;
//這裡為了方便ans初值定為1,因為單個節點也可以作為對稱二叉樹,所以答案最小是1
intgetsum
(int pos)
bool
check
(int x,
int y)
void
getans
(int pos)
if(vec[pos][1
]^-1
)getans
(vec[pos][1
]);if
(vec[pos][0
]^-1
)getans
(vec[pos][0
]);//如果不對稱分別判斷左右子樹是否對稱
//vec的定義詳見定義
}int
main()
sum[1]
=getsum(1
);//計算所有節點的子樹大小(包括根節點)
getans(1
);//求出答案
printf
("%d\n"
,ans)
;}
NOIP2018普及組複賽解析
輸入乙個字串,求字串除了空格的字元個數 這種考你會不會程式設計的題不會?include include include using namespace std int ans string c intmain 乙個長度為n序列,被中間點m分成兩半,m左邊和m右邊。左邊戰鬥力為 i 1m 1 m i ...
NOIP2018普及組複賽試題第4題解析
第4題 對稱二叉樹 題目描述 一棵有點權的有根樹如果滿足以下條件,則被軒軒稱為對稱二叉樹 二叉樹 將這棵樹所有節點的左右子樹交換,新樹和原樹對應位置的結構相同且點權相等。下圖中節點內的數字為權值,節點外的 id表示節點編號。現在給出一棵二叉樹,希望你找出它的一棵子樹,該子樹為對稱二叉樹,且節點數 最...
NOIP2018普及組 參賽總結
發現就我只打了這麼一點字,所以再重新發一下 考前 考試前一天晚上一直在看電視 看到了10點還是11點吧,寫了一會兒會兒作業,但我覺得這不是考砸了的理由 誰叫我本來就如此之水 第二天早上很早就起床了,還順便跟外婆還有老媽去小區外面吃了個早餐。然後老媽帶我來了考場,也是在附近萬達吃了飯,走路就花了我差不...