第七周 7-3 樹(shù)的同構(gòu)

題目

給定兩棵樹(shù)T1和T2。如果T1可以通過(guò)若干次左右孩子互換就變成T2,則我們稱(chēng)兩棵樹(shù)是“同構(gòu)”的。例如圖1給出的兩棵樹(shù)就是同構(gòu)的,因?yàn)槲覀儼哑渲幸豢脴?shù)的結(jié)點(diǎn)A、B、G的左右孩子互換后,就得到另外一棵樹(shù)。而圖2就不是同構(gòu)的。

輸入格式:

輸入給出2棵二叉樹(shù)樹(shù)的信息。對(duì)于每棵樹(shù),首先在一行中給出一個(gè)非負(fù)整數(shù)N (≤10),即該樹(shù)的結(jié)點(diǎn)數(shù)(此時(shí)假設(shè)結(jié)點(diǎn)從0到N?1編號(hào));隨后N行,第i行對(duì)應(yīng)編號(hào)第i個(gè)結(jié)點(diǎn),給出該結(jié)點(diǎn)中存儲(chǔ)的1個(gè)英文大寫(xiě)字母、其左孩子結(jié)點(diǎn)的編號(hào)、右孩子結(jié)點(diǎn)的編號(hào)。如果孩子結(jié)點(diǎn)為空,則在相應(yīng)位置上給出“-”。給出的數(shù)據(jù)間用一個(gè)空格分隔。注意:題目保證每個(gè)結(jié)點(diǎn)中存儲(chǔ)的字母是不同的。

輸出格式:

如果兩棵樹(shù)是同構(gòu)的,輸出“Yes”,否則輸出“No”。

輸入樣例1(對(duì)應(yīng)圖1):

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 -

輸出樣例1:

Yes

輸入樣例2(對(duì)應(yīng)圖2):

8
B 5 7
F - -
A 0 3
C 6 -
H - -
D - -
G 4 -
E 1 -
8
D 6 -
B 5 -
E - -
H - -
C 0 2
G - 3
F - -
A 1 4

輸出樣例2:

No

題解

直觀上感覺(jué)用數(shù)組做比較簡(jiǎn)單,所以以下是用數(shù)組完成的代碼.
關(guān)鍵是找出根節(jié)點(diǎn)與判斷是否同構(gòu)。這個(gè)函數(shù)比較復(fù)雜也很暈,需要考慮周全

#include<iostream>

using namespace std;

typedef char ElementType;
typedef struct TreeNode Tree;
//結(jié)構(gòu)體
struct TreeNode {
    ElementType data;
    int left;
    int right;
}t1[101],t2[101];
//建樹(shù)
int Build(Tree t[]) 
{
    bool a[101] = { false };
    int n;
    cin >> n;
    char data, left, right;
    for (int i = 0; i < n; i++)
    {
        cin >> data >> left >> right;
        t[i].data = data;
        //判斷左右節(jié)點(diǎn)是否空
        if (left == '-')
            t[i].left = -1;
        else {
            t[i].left = left-'0';
            a[(int)left - 48] = true;
        }
        
        if (right == '-')
            t[i].right = -1;
        else {
            t[i].right = (int)right-48;
            a[(int)right - 48] = true;
        }
    }
    //判斷是不是根節(jié)點(diǎn),根節(jié)點(diǎn)沒(méi)有雙親結(jié)點(diǎn)
    for (int i = 0; i < n; i++)
    {
        //cout << t[i].data <<" "<< t[i].left <<" "<< t[i].right <<" "<< a[i] << endl;;
        if (!a[i])
            return i;
    }
    return -1;
}

bool Compare(int r1,int r2)
{
    if (r1 == -1 && r2 == -1)
        return true;
    else if ((r1 == -1 && r2 != -1) || (r2 == -1 && r1 != -1))
        return false;
    else if (t1[r1].data != t2[r2].data)
        return false;
    else if (t1[r1].left == -1 && t2[r2].left == -1)
        return Compare(t1[r1].right, t2[r2].right);
    else if ((t1[r1].left != -1 && t2[r2].left != -1) && (t1[t1[r1].left].data == t2[t2[r2].left].data))
        return Compare(t1[r1].left, t2[r2].left) && Compare(t1[r1].right, t2[r2].right);
    else
        return Compare(t1[r1].left, t2[r2].right) && Compare(t1[r1].right, t2[r2].left);
}

int main()
{
    int root1 = Build(t1);
    int root2 = Build(t2);
    cout << root1 << " " << root2 << " ";
    
    bool flag = Compare(root1, root2);
    if (flag)
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
        
    system("pause");
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類(lèi)型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 4,007評(píng)論 0 2
  • B樹(shù)的定義 一棵m階的B樹(shù)滿(mǎn)足下列條件: 樹(shù)中每個(gè)結(jié)點(diǎn)至多有m個(gè)孩子。 除根結(jié)點(diǎn)和葉子結(jié)點(diǎn)外,其它每個(gè)結(jié)點(diǎn)至少有m...
    文檔隨手記閱讀 13,666評(píng)論 0 25
  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系,并對(duì)這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算,而且確保經(jīng)過(guò)這...
    Winterfell_Z閱讀 6,584評(píng)論 0 13
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,136評(píng)論 0 2
  • 親愛(ài)的自己,參加此次特種兵訓(xùn)營(yíng)已經(jīng)過(guò)去一個(gè)星期了,時(shí)間過(guò)的飛快,快到一天24小時(shí)我根本不夠用,我總是有做不完的事情...
    鐘仁芬閱讀 235評(píng)論 0 0

友情鏈接更多精彩內(nèi)容