在網上做了一道簡單的練習題,判斷兩棵樹是否同構:
題目描述:給定兩棵樹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...