sdut oj3340 資料結構實驗之二叉樹一:樹的同構
資料結構實驗之二叉樹一:樹的同構
Time Limit: 1000MS Memory limit: 65536K
題目描述
給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構”的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點A、B、G的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。
圖1
圖2
現給定兩棵樹,請你判斷它們是否是同構的。
輸入
輸入資料包含多組,每組資料給出2棵二叉樹的資訊。對於每棵樹,首先在一行中給出一個非負整數N (≤10),即該樹的結點數(此時假設結點從0到N−1編號);隨後N行,第i行對應編號第i注意:題目保證每個結點中儲存的字母是不同的。
輸出
如果兩棵樹是同構的,輸出“Yes”,否則輸出“No”。示例輸入
8 A 1 2 B 3 4 C 5 - D - - E 6 - G 7 - F - - H - - 8 G - 4 B 7 6 F - - A 5 1 H - - C 0 - D - - E 2 -
示例輸出
Yes
提示
測試資料對應圖1來源
xam思路:
輸入的順序就是它們的編號,如第二組中G是0,B是1
程式碼實現:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; struct Tree { char data; Tree *lchild,*rchild; }; struct node { char s; int l,r; } a[33]; Tree *Creat(int k)///從根節點開始遞迴建樹, { Tree *T; T = new Tree; T->lchild = NULL; T->rchild = NULL; T->data = a[k].s; if(a[k].l != -1) T->lchild = Creat(a[k].l); if(a[k].r != -1) T->rchild = Creat(a[k].r); return T; } Tree *Build(int n) { int j; int v[50]; memset(v,0,sizeof(v));///標記該點是否為其他點的孩子,=1時表示在孩子中出現過, ///= 0,時說明為出現,則該點一定是根節點 for(int i = 0; i < n; i++) { char s1[10],s2[10],s3[10]; scanf("%s%s%s",s1,s2,s3); a[i].s = s1[0]; if(s2[0] == '-') a[i].l = -1; else { a[i].l = s2[0] - '0'; v[a[i].l] = 1; } if(s3[0] == '-') a[i].r = -1; else { a[i].r = s3[0] - '0'; v[a[i].r] = 1; } } if(n != 0) { for(j = 0; j < n; j++)///如果該點的v【j】==0 , ///說明該點在其他點的孩子中從未出現過,那麼該點一定為根節點 if(!v[j]) break; } Tree *root = Creat(j); return root; } int Judge(Tree *T1,Tree *T2) { if(T1 == NULL&&T2 == NULL)///兩個都為空時必定同構 return 1; else if(T1 != NULL&&T2 != NULL)///都不為空時 { if(T1->data != T2->data)///如果根節點就不相同,則必不同構 return 0; if((Judge(T1->lchild,T2->lchild)&&Judge(T1->rchild,T2->rchild))///遞迴,左左同構或者左右同構,則同構 ||(Judge(T1->lchild,T2->rchild)&&Judge(T1->rchild,T2->lchild))) return 1; } else///其他情況,一個為空一個不為空時,不同狗 return 0; } int main() { int n,m; Tree *T1,*T2; while(~scanf("%d",&n)) { T1 = Build(n); scanf("%d",&m); T2 = Build(m); if(Judge(T1,T2)) printf("Yes\n"); else printf("No\n"); } return 0; }
相關推薦
sdut oj3340 資料結構實驗之二叉樹一:樹的同構
資料結構實驗之二叉樹一:樹的同構 Time Limit: 1000MS Memory limit: 65536K 題目描述 給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構”的。例如圖1給出的兩棵樹就是同構的,因為
【二叉樹】SDUT 3342 資料結構實驗之二叉樹三:統計葉子數
Problem Description 已知二叉樹的一個按先序遍歷輸入的字元序列,如abc,,de,g,,f,,, (其中,表示空結點)。請建立二叉樹並求二叉樹的葉子結點個數。 Input 連續輸入多組資料,每組資料輸入一個長度小於50個字元的字串。 Output 輸出
SDUT OJ 資料結構實驗之二叉樹三:統計葉子數
資料結構實驗之二叉樹三:統計葉子數Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description已知二叉樹的一個按先序遍歷輸入的字元序列,如
SDUT OJ 資料結構實驗之二叉樹二:遍歷二叉樹
資料結構實驗之二叉樹二:遍歷二叉樹 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知二叉樹的一個按先序遍歷輸入的字元序列,如abc,,de,g,,f,,, (其中,表示空結點)。請建
資料結構實驗之二叉樹六:哈夫曼編碼(SDUT 3345)
題解:離散中的“最小生成樹(最優樹)”。 #include <bits/stdc++.h> using namespace std; void qusort(int l, int r, int a[]) { int x = a[l]; int i = l, j =
資料結構實驗之二叉樹一:樹的同構 (SDUT 3340)
題解:把原本結構體的左右子樹的型別定義成 int 型,用來存放這個結點的左右子樹的編號,分別建造兩棵二叉樹,按個比較,如果在第二棵樹中沒有找到,那麼就不用在判斷了。 #include <bits/stdc++.h> using namespace std; struct node
資料結構實驗之二叉樹八:(中序後序)求二叉樹的深度(SDUT 2804)
#include <stdio.h> #include <stdlib.h> #include <string.h> struct node { char data ; struct node *l,*r; }; struct node *cr
資料結構實驗之二叉樹七:葉子問題(SDUT 3346)
#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; }; char a[100]; int num = 0; struct node
資料結構實驗之二叉樹四:(先序中序)還原二叉樹 (SDUT 3343)
#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; }; char a[100],b[100]; int n; struct node
資料結構實驗之二叉樹五:層序遍歷 (SDUT 3344)
#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; }; char s[505]; int num; struct node *cre
資料結構實驗之二叉樹三:統計葉子數 SDUT 3342
#include <stdio.h> #include <string.h> struct node { char data; struct node *l,*r; }; struct node *root; char st[51]; int i; in
資料結構實驗之二叉樹二:遍歷二叉樹 SDUT 3341
#include <bits/stdc++.h> using namespace std; struct Tree { char data; struct Tree *right; struct Tree *left; }; char str[55]; in
資料結構實驗之二叉樹三:統計葉子數 SDUT 3342
#include <stdio.h> #include <string.h> struct node { char data; struct node *l,*
資料結構實驗之二叉樹五:層序遍歷 (sdut OJ 3344)
資料結構實驗之二叉樹五:層序遍歷 Time Limit: 1000ms Memory limit: 65536K 有疑問?點這裡^_^ 題目描述 已知一個按先序輸入的字元序
SDUTOJ3344資料結構實驗之二叉樹五:層序遍歷
資料結構實驗之二叉樹五:層序遍歷 https://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2711/pid/3344 Time Limit: 1000 ms Memo
3340--資料結構實驗之二叉樹一:樹的同構
現給定兩棵樹,請你判斷它們是否是同構的。 Input 輸入資料包含多組,每組資料給出2棵二叉樹的資訊。對於每棵樹,首先在一行中給出一個非負整數N (≤10),即該樹的結點數(此時假設結點從0到N−1編號);隨後N行,第i行對應編號第i個結點,給出該結點中儲存的1
資料結構實驗之二叉樹三:統計葉子數
Problem Description 已知二叉樹的一個按先序遍歷輸入的字元序列,如abc,de,g,f, (其中,表示空結點)。請建立二叉樹並求二叉樹的葉子結點個數。 Input 連續輸入多組資料,每
資料結構實驗之二叉樹二:遍歷二叉樹
Problem Description 已知二叉樹的一個按先序遍歷輸入的字元序列,如abc,de,g,f, (其中,表示空結點)。請建立二叉樹並按中序和後序的方式遍歷該二叉樹。 Input 連續輸入多組資料,每組資料輸入一個長度小於50個字元的字串。 Outpu
資料結構實驗之二叉樹三:統計葉子數(有返回值版)
Problem Description 已知二叉樹的一個按先序遍歷輸入的字元序列,如abc,de,g,f, (其中,表示空結點)。請建立二叉樹並求二叉樹的葉子結點個數。 Input 連續輸入多組資料,每組資料輸入一個長度小於50個字元的字串。 Output 輸出
資料結構實驗之二叉樹四:(先序中序)還原二叉樹
Problem Description 給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。 Input 輸入資料有多組,每組資料第一行輸入1個正整數N(1 <= N <=