bLue的二叉树_JAVA
Description
Keke 是一個(gè)喜愛種樹的人,他對(duì)各種樹都有很深的研究。
MLE 聽說 bLue 種了一些新品種的樹,就想邀請(qǐng) Keke 去圍觀一下。
PBH 在暗中把這一切盡收眼底,作為資深植樹行家,他雖不屑,但也決定和他們一起去看一看。
于是,大家便一起到了 bLue 家去看樹。
bLue 有兩棵二叉樹,分別有 n 和 m 個(gè)節(jié)點(diǎn),編號(hào)分別為 1-n 和 1-m,每個(gè)節(jié)點(diǎn)都有一個(gè)權(quán)值,bLue 想知道第一棵樹的所有子樹中與第二棵樹完全相同的個(gè)數(shù)(不考慮節(jié)點(diǎn)編號(hào))。
Input
輸入數(shù)據(jù)有多組(數(shù)據(jù)組數(shù)不超過 150),到 EOF 結(jié)束。
對(duì)于每組數(shù)據(jù):
第一行有兩個(gè)整數(shù) n (0 < n <= 10^5) 和 m (0 < m <= 10^5),表示第一棵樹和第二棵樹的節(jié)點(diǎn)個(gè)數(shù) 接下來 n 行,表示第一棵樹:第 i (0 < i <= n) 行有 3 個(gè)整數(shù),w[i] (0 < w[i] <= 10), lc[i], rc[i] (0 < lc[i], rc[i] <= n),分別表示節(jié)點(diǎn) i 的權(quán)值,該節(jié)點(diǎn)的左孩子編號(hào)和右孩子編號(hào),若某個(gè)孩子不存在,則為 0 (數(shù)據(jù)保證每棵樹都是合法的有根二叉樹) 接下來 m 行,表示第二棵樹:格式同第一棵樹保證:樹的最大深度不會(huì)超過 10000。
Output
對(duì)于每組數(shù)據(jù),輸出一行一個(gè)整數(shù) num,表示第一棵樹的所有子樹中與第二棵樹完全相同的個(gè)數(shù)。
Sample
Input
7 4
1 6 3
2 0 4
1 7 0
3 0 0
1 2 1
2 0 0
2 0 0
2 0 0
1 4 0
1 1 2
2 0 0
3 3
1 0 0
2 1 3
3 0 0
1 0 3
2 1 0
3 0 0
Output
1
0
Hint
數(shù)據(jù)量比較大,推薦用 scanf 等讀入。
#include<bits/stdc++.h> #define LL long long #define MEM(a, b) memset(a, b, sizeof(a)) using namespace std; struct Node {int w, lc, rc; }; Node a[100005], b[100005]; int avis[100005], bvis[100005]; int na[100005 * 3 + 10], nb[100005 * 3 + 10]; // 包含空節(jié)點(diǎn)所以數(shù)組大小擴(kuò)大3倍 int nest[100005 * 3 + 10]; int la, lb; void adfs(int x) {na[la++] = a[x].w;if(x == 0) return;adfs(a[x].lc);adfs(a[x].rc); } void bdfs(int x) {nb[lb++] = b[x].w;if(x == 0) return;bdfs(b[x].lc);bdfs(b[x].rc); } void Getnest(int n) {int j = 0;int i = 1;nest[1] = 0;while(i <= n){if(j == 0 || nb[i] == nb[j]){j++;i++;if(nb[i] == nb[j])nest[i] = nest[j];elsenest[i] = j;}elsej = nest[j];} } int kmp(int n, int m) {int i = 1;int j = 1;int ans = 0;while(i <= n){if(j == 0 || na[i] == nb[j]){i++;j++;}elsej = nest[j];if(j >= m + 1){ans++;j = nest[j];}}return ans; } int main() {int n, m;while(scanf("%d %d", &n, &m) != EOF){MEM(avis, 0);MEM(bvis, 0);for(int i = 1 ; i <= n ; i++){scanf("%d %d %d", &a[i].w, &a[i].lc, &a[i].rc);avis[a[i].lc]++;avis[a[i].rc]++;}for(int i = 1 ; i <= m ; i++){scanf("%d %d %d", &b[i].w, &b[i].lc, &b[i].rc);bvis[b[i].lc]++;bvis[b[i].rc]++;}la = lb = 1;for(int i = 1 ; i <= n ; i++)if(avis[i] == 0){adfs(i);break;}for(int i = 1 ; i <= m ; i++)if(bvis[i] == 0){bdfs(i);break;}Getnest(lb - 1);int ans = kmp(la - 1, lb - 1);printf("%d\n", ans);} } 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的bLue的二叉树_JAVA的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Period_JAVA
- 下一篇: 高中数学?_JAVA