給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是「同構」的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a、b、g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。
現給定兩棵樹,請你判斷它們是否是同構的。
輸入給出2棵二叉樹樹的資訊。對於每棵樹,首先在一行中給出乙個非負整數n (≤10),即該樹的結點數(此時假設結點從0到n−1編號);隨後n行,第i行對應編號第i個結點,給出該結點中儲存的1個英文大寫字母、其左孩子結點的編號、右孩子結點的編號。如果孩子結點為空,則在相應位置上給出「-」。給出的資料間用乙個空格分隔。注意:題目保證每個結點中儲存的字母是不同的。
如果兩棵樹是同構的,輸出「yes」,否則輸出「no」。
8
a 12
b 34
c 5-
d --
e 6-
g 7-
f --
h --
8g -
4b 7
6f -
-a 5
1h -
-c 0
-d -
-e 2
-
yes
8
b 57
f --
a 03
c 6-
h --
d --
g 4-
e 1-
8d 6
-b 5
-e -
-h -
-c 0
2g -
3f -
-a 1
4
no
根據題目描述中的「如果t1可以通過若干次左右孩子互換就變成t2」可以知道,無論左右孩子換了幾次,該節點始終擁有這個兩個子。可以理解為將有序變為無序。
改題目運用靜態陣列來存放二叉樹,那可以直接通過迴圈查詢來判斷相同資料域的節點的左右孩子是否相同即可。
#include
using
namespace std;
typedef
struct
tree;
intmain()
cin >> m;
for(
int i =
0; i < m; i++
)int flag =0;
for(
int i =
0; i < n; i++
)else}}
else
if(first[i]
.left !=
'-'&& first[i]
.right ==
'-')
else
if(second[j]
.left !=
'-'&& second[j]
.right !=
'-')
else
if(second[j]
.left !=
'-'&& second[j]
.right ==
'-')
}else}}
else
if(first[i]
.left ==
'-'&& first[i]
.right !=
'-')
else
if(second[j]
.left !=
'-'&& second[j]
.right !=
'-')
else
if(second[j]
.left !=
'-'&& second[j]
.right ==
'-')
}else}}
else}}
}if(t ==0)
}if(flag ==1)
else
return0;
}
資料結構學習 樹
樹結構是二叉樹的擴充套件,二叉樹在乙個節點上只有兩個子節點,而樹結構在乙個節點上不只有兩個,可以有n個,n大於等於0,更具有一般意義。二叉樹的概念同樣適用於樹,如完全數,滿樹等,此外還有 有序樹 結點的各子樹從左到右是有次序的,即若交換各子樹相對位置會構成不同的樹。無序樹 結點的各子樹從左到右是無次...
資料結構學習 樹
樹是n個結點的有限集合。n 0時稱為空樹,在任意一棵非空樹中 1 有且僅有乙個特定的稱為根的結點。2 當n 1時,其餘結點可以分為m個互不相交的有限集合,其中每乙個集合本身又是一棵樹。在此,我們主要來學習二叉樹的應用。結點擁有的子樹數稱為結點的度。度為0的結點稱為葉子結點或者終端結點。度不為0的結點...
PTA 資料結構與演算法 7 3 樹的同構
如有不對 不吝賜教 給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。現給定兩棵樹,請你判斷它們是否是同構的。輸入格式 輸入給出2...