1. 程式人生 > >sdut oj3340 資料結構實驗之二叉樹一:樹的同構

sdut oj3340 資料結構實驗之二叉樹一:樹的同構

資料結構實驗之二叉樹一:樹的同構

Time Limit: 1000MS Memory limit: 65536K

題目描述

給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構”的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點A、B、G的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。




圖1


圖2

現給定兩棵樹,請你判斷它們是否是同構的。

輸入

 輸入資料包含多組,每組資料給出2棵二叉樹的資訊。對於每棵樹,首先在一行中給出一個非負整數N (10),即該樹的結點數(此時假設結點從0N−1編號);隨後N行,第i行對應編號第i
個結點,給出該結點中儲存的1個英文大寫字母、其左孩子結點的編號、右孩子結點的編號。如果孩子結點為空,則在相應位置上給出”-”。給出的資料間用一個空格分隔。
注意:題目保證每個結點中儲存的字母是不同的。

輸出

 如果兩棵樹是同構的,輸出“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 <=