給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是「同構」的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a、b、g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。
圖1
圖2現給定兩棵樹,請你判斷它們是否是同構的。
輸入給出2棵二叉樹樹的資訊。對於每棵樹,首先在一行中給出乙個非負整數n (≤10),即該樹的結點數(此時假設結點從0到n−1編號);隨後n行,第i行對應編號第i個結點,給出該結點中儲存的1個英文大寫字母、其左孩子結點的編號、右孩子結點的編號。如果孩子結點為空,則在相應位置上給出「-」。給出的資料間用乙個空格分隔。注意:題目保證每個結點中儲存的字母是不同的。
如果兩棵樹是同構的,輸出「yes」,否則輸出「no」。
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 -
yes
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
no
思路:
1.如何判定兩棵樹同構?
從遞迴的角度來看,兩棵樹同構必然是根結點資料相等,左子樹與左子樹同構+右子樹與右子樹同構(且稱為正向同構),或者左子樹與右子樹同構+右子樹與左子樹同構(且稱為映象同構)。
總體的思路是先比較根結點,再遞迴的比較左右子樹。
1)若兩棵樹為空,我們認為兩棵空樹是同構的。
2)若兩棵樹中只有一顆為空,這兩棵樹肯定不同構。
3)若兩棵樹均不為空,再看其根結點資料:
① 若不相等,肯定也不同構。②若根結點相等,這時候要看其左右子樹是否同構。
4)若兩棵樹左子樹均為空,則可認為其左子樹是同構的,直接遞迴的去比較右子樹是否同構即可。
5)若兩棵樹左子樹均不為空其左子樹的根結點相同,由於資料沒有重複,則只可能是正向同構!!
6)若兩棵樹左子樹均不為空其左子樹的根結點不同,則只可能是映象同構!!
2.如何確定根結點?
該題沒有直接給出根結點,對於每棵樹我們可以使用乙個標記陣列,當輸入資料時,每個左右子結點都記為true,這樣最後遍歷一遍標記陣列,剩餘為false的為根結點。(下標對齊)注意初始化的使用要用memset將標記陣列清零。
3.其他細節
1)memset用於對陣列賦乙個相同的值(最好是-1和0,所以標記陣列初始化為false比較方便)標頭檔案是string.h
2)由於輸入的結點為空時用「-」來標識,所以用「%c」來輸入,但%c可能會吸收上一行遺留的換行符,故先用getchar()把上一行的換行符吸收了。
3)使用二叉樹的靜態儲存,操作比較方便。
哇我好菜啊,我什麼時候才能不這麼菜嗚嗚嗚
#include#include#include#includeusing namespace std;
const int maxn=1000010; //兩個多項式指數取上限時為10的6次方
int n1,n2;
struct node;
node tree1[10],tree2[10];
bool mark1[10],mark2[10];//用於尋找根結點,為true時肯定不為根結點
bool issame(int n1,int n2)
else tree1[i].lchild=-1;
if(r>='0'&&r<='9')
else tree1[i].rchild=-1;
} scanf("%d",&n2);
for(int i=0;i='0'&&l<='9')
else tree2[i].lchild=-1;
if(r>='0'&&r<='9')
else tree2[i].rchild=-1;
} if(n1==0||n2==0)
if(n1!=n2)
/*尋找根結點*/
int root1,root2;
for(int i=0;i
}for(int i=0;i
}//cout<
if(issame(root1,root2)) printf("yes\n");
else printf("no\n");
} return 0;
}
PTA 7 3 樹的同構
題目描述 給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。現在給定兩棵樹,請你判斷是否是同構的。很慚愧,這個題目做的很複雜,但是...
PTA 7 3樹的遍歷
7 3 樹的遍歷 25 分 給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。輸入格式 輸入第一行給出乙個正整數n 30 是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。輸出格式 在一行中輸出該樹的層序遍歷的序...
PTA 7 3 樹的同構 C語言判斷兩棵樹是否同構
題目出處 同構的定義 給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。圖一 圖二現給定兩棵樹,請你判斷它們是否是同構的。輸入格式...