PTA練習題 樹的同構

2021-08-29 01:41:37 字數 2512 閱讀 8738

在網上做了一道簡單的練習題,判斷兩棵樹是否同構:

題目描述:給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是「同構」的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a、b、g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。

輸入格式:

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

輸出格式:

如果兩棵樹是同構的,輸出「yes」,否則輸出「no」。

輸入樣例1:

8a 1 2

b 3 4

c 5 -

d - -

e 6 -

g 7 -

f - -

h - -

8g - 4

b 7 6

f - -

a 5 1

h - -

c 0 -

d - -

e 2 -

輸出:yes 

輸入樣例2:

8b 5 7

f - -

a 0 3

c 6 -

h - -

d - -

g 4 -

e 1 -

8d 6 -

b 5 -

e - -

h - -

c 0 2

g - 3

f - -

a 1 4

輸出:no

1.由於各個節點在輸入時,順序是不定的,因此它出現的順序和它在樹中的實際位置沒有必然的聯絡。因此,我們首先肯定要用乙個陣列儲存輸入資訊。

2.輸入結束後,可以找到根節點:一棵樹裡面,有且僅有乙個節點沒有父節點,即根節點。由這個性質可以查詢出根節點。

3.實際上,讀入輸入時,我們用來儲存輸入的陣列就是一顆順序儲存的樹了,因此沒有必要再去用指標構造一棵樹,以避免空間的浪費。在用指標給出一棵樹時,我們只用給出這棵樹的根結點的指標即可。這裡同樣,我們給出一棵樹,除了陣列(用來儲存各節點資訊及其左右child的位置)之外,還要給出這顆樹的根節點在陣列中的下標。這兩個資訊給出了一棵完整的樹。

4.判斷兩棵樹是否同構,可以利用遞迴的思想(這種思想在樹中往往非常有用)。我們現在有兩顆樹了,判斷它們是否同構,可以這麼做:

(1)如果都是空樹,同構。

(2)如果一棵空,一棵非空,不同構。

(3)如果兩棵都非空,進一步判斷:

(3.1)如果兩棵樹根節點的資訊不相同,不同構。否則,還要進一步判斷:

(3.1.1)如果樹1左子樹和樹2左子樹同構,那麼就看樹1和樹2的右子樹是否同構,如果是則樹1樹2同構,否則不同構。

(3.1.2)如果樹1左子樹和樹2右子樹同構,那麼就看樹1右子樹和樹2左子樹是否同構,如果是則樹1樹2同構,否則不同構。

(3.1.3)如果樹1的左子樹和樹2的左、右子樹都不同構,則樹1樹2不同構。

顯然,這些操作可以利用遞迴實現。

#define _crt_secure_no_warnings

#include#includestruct treeelement ;

struct treeinformation ;

typedef struct treeinformation * binarytree;

int isemptytree(binarytree t)//判斷是否空樹

int findrootindex(int number, struct treeelement * input)

for (i = 0; i < number; i++)

} free(tag);

return root;

}binarytree createinputtree()// 接受輸入,並找到根節點,構造出整棵樹

if (number <= 0) ;

int root = findrootindex(number, input);

if (root < 0)

binarytree t = (binarytree)malloc(sizeof(struct treeinformation));

t->root = root; t->treearray = input;

return t;

}int isisostructural(binarytree t1, binarytree t2)//判斷兩棵樹是否同構

} if (isisostructural(leftchild1, rightchild2))

} free(leftchild1); free(leftchild2); free(rightchild1); free(rightchild2);

return 0; }}

int main()//主函式

PTA習題 樹的同構

7 3 樹的同構 25 分 給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。圖1 圖2 現給定兩棵樹,請你判斷它們是否是同構的。...

PTA練習題 旅遊規劃

有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度 以及該公路要收取的過路費。現在需要你寫乙個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。輸入格式 輸入說明 輸入資料的第1行給出4個正整數n m s d,其中n 2 n 50...

PTA 演算法練習題 回溯

1.最佳排程問題 假設有n n 20 個任務由k k 20 個可並行工作的機器完成。完成任務i需要的時間為ti。試設計乙個演算法,對任意給定的整數n和k,以及完成任務i 需要的時間為ti i 1 n。計算完成這n個任務的最佳排程,使得完成全部任務的時間最早。輸入格式 輸入資料的第一行有2 個正整數n...