例:給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是「同構」的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a、b、g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。
現給定兩棵樹,請你判斷它們是否是同構的。
輸入格式:
輸入給出2棵二叉樹樹的資訊。對於每棵樹,首先在一行中給出乙個非負整數n (≤10),即該樹的結點數(此時假設結點從0到n−1編號);隨後n行,第i行對應編號第i個結點,給出該結點中儲存的1個英文大寫字母、其左孩子結點的編號、右孩子結點的編號。如果孩子結點為空,則在相應位置上給出「-」。給出的資料間用乙個空格分隔。注意:題目保證每個結點中儲存的字母是不同的。
輸出格式:
如果兩棵樹是同構的,輸出「yes」,否則輸出「no」。
輸入樣例1:
8
a 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 -
輸入樣例2:
8
b 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
求解思路:
二叉樹表示
根據輸入建立二叉樹
判斷同構
二叉樹表示
由於此題輸入的特殊性,所以可以用結構陣列來表示二叉樹,當然動態鍊錶來表示也可以。
結構陣列表示二叉樹:靜態鍊錶
#define maxtree 10
#define elementtype char
#define tree int
#define null -1
struct treenode t1[maxtree], t2[maxtree];
主程式框架
int main()
else
return 0;
}
建立二叉樹
對於輸入,不確定哪個是樹的根,這裡用乙個check陣列來計數,如果輸入**現了乙個子結點的編號,就說明這個子結點不可能是樹的根,所以沒出現過的編號,就說明是這個樹的根。
tree buildtree ( struct treenode t)
(樹) 二叉樹鍊錶表示
1.二叉樹新節點的插入 create root,val class node def init self self.data 0 self.left none self.right none def create root,val newnode node newnode.data val newn...
二叉樹的二叉鍊錶表示
鏈式儲存結構 二叉樹的鏈式儲存結構是指,用鍊錶來表示一棵二叉樹,即用鏈來指示元素的邏輯關係。通常的方法是鍊錶中每個結點由三個域組成,資料域和左右指標域,左右指標分別用來給出該結點左孩子和右孩子所在的鏈結點的儲存位址。其結點結構為 其中,data域存放某結點的資料資訊 lchild與rchild分別存...
二叉樹 樹的同構
給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。現給定兩棵樹,請你判斷它們是否是同構的。輸入格式 輸入給出2棵二叉樹樹的資訊。對...