PJ2018T4 对称二叉树 树形结构
生活随笔
收集整理的這篇文章主要介紹了
PJ2018T4 对称二叉树 树形结构
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:現在給出一棵二叉樹,希望你找出它的一棵子樹,該子樹為對稱二叉樹,且節點數最多。請輸出這棵子樹的節點數。對稱二叉樹滿足:將這棵樹所有節點的左右子樹交換后,新樹和原樹對應位置的結構相同且點權相等。
(注意輸入的是當前節點的左兒子和右兒子,若輸入-1則表示該位置不存在點)
?
數據范圍:n <= 1000000.
------------------------------------------我是分割線------------------------------------
題解: 首先預處理每棵子樹的大小,用size[x]表示x的子樹大小,接下來直接枚舉每個點檢驗即可,非常簡單。
?
#include<bits/stdc++.h>#define ll long long #define mp make_pair #define rep(i, a, b) for(int i = (a); i <= (b); i++) #define per(i, a, b) for(int i = (a); i >= (b); i--)using namespace std;typedef pair<int, int> pii; typedef double db; const int N = 1e6 + 50; int n, head[N], cnt = 0, a[N]; int size[N], f[N], lson[N], rson[N]; int ans; inline int read(){int x = 0, f = 1;char ch = getchar();while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar();}while(ch >='0' && ch <='9') { x = (x<<3)+(x<<1)+(ch^48); ch = getchar();}return x*f; } void init(){n = read();rep(i, 1, n) a[i] = read();rep(i, 1, n) {lson[i] = read(); rson[i] = read();} } void dfs(int x){size[x] = 1;if(lson[x] != -1){dfs(lson[x]);size[x] += size[lson[x]];}if(rson[x] != -1){dfs(rson[x]);size[x] += size[rson[x]];}return; } bool check(int u, int v){if(u == -1 && v == -1) return true;if(u != -1 && v != -1 && a[u] == a[v] && check(lson[u], rson[v]) && check(rson[u], lson[v]))return true;return false; } void work(){dfs(1); rep(i, 1, n) {if(check(lson[i], rson[i]))ans = max(ans, size[i]);}printf("%d\n", ans); } int main(){init();work();return 0; } View Code?
(刷水題不是我的本意,愉悅身心才是我的真正目的qwq).
?
轉載于:https://www.cnblogs.com/smilke/p/11580523.html
總結
以上是生活随笔為你收集整理的PJ2018T4 对称二叉树 树形结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#从构造函数中调用其他构造函数
- 下一篇: synchronized同步方法概述