PTA 7 3 樹的同構 遞迴實現

2021-09-24 05:45:31 字數 2637 閱讀 9770

給定兩棵樹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就不是同構的。圖一 圖二現給定兩棵樹,請你判斷它們是否是同構的。輸入格式...