PTA 7 3 樹的同構

2021-10-23 00:11:31 字數 2226 閱讀 5536

題目描述:

給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是「同構」的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a、b、g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。

現在給定兩棵樹,請你判斷是否是同構的。

很慚愧,這個題目做的很複雜,但是思路很清晰,希望能分享出來,

思路和難點如下:

同構的樹有乙個特點,那就是每一層的結點都是一樣的,有且僅出現一次。

所以我們只需要使用層序遍歷來進行比較就行了

我們需要讀取樹,而且需要確定樹的根結點

確定樹的根結點的時候,我們可以使用乙個布林陣列來記錄

沒有成為過子結點的結點就是根結點

讀取樹的過程中,我們不能使用 scanf 直接讀取,因為會讀到空格和換行,我們可以使用 getchar() 來吃掉空格

所以我們按照以上思路完成**如下:

/*

* author: veeupup

* 樹的同構

*/#include

#include

#include

#include

#include

#include

#include

using

namespace std;

struct node

tree1[11]

, tree2[11]

;// 兩棵樹分別儲存左右兩邊的資訊

bool

cmp(node a, node b)

int n1, n2;

int head1, head2;

// 記錄頭結點

bool isroot[11]

=;// 記錄是否是頭結點

vector layers1[15]

, layers2[15]

;// 儲存每層的結點

char tempdata, templeft, tempright;

string str;

queue<

int> myq;

int nowlayer;

intmain()

elseif(

isdigit

(tempright)

)else

}for

(int i =

0; i < n1; i++)}

myq.

push

(head1)

; nowlayer =1;

tree1[head1]

.layer = nowlayer;

// 層序遍歷

int topid;

while

(!myq.

empty()

)if(tree1[topid]

.right !=-1

)}}scanf

("%d"

,&n2)

;getchar()

;if(n2 !=0)

elseif(

isdigit

(tempright)

)else

}for

(int i =

0; i < n2; i++)}

myq.

push

(head2)

; nowlayer =1;

tree2[head2]

.layer = nowlayer;

while

(!myq.

empty()

)if(tree2[topid]

.right !=-1

)}}bool flag =

true

;for

(int i =

0; i <=

11; i++

)else

if(layers1[i]

.size()

!=0)}

}}if(

!flag)

else

return0;

}

PTA 7 3 樹的同構 遞迴實現

給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。圖1 圖2現給定兩棵樹,請你判斷它們是否是同構的。輸入給出2棵二叉樹樹的資訊。對...

PTA 7 3樹的遍歷

7 3 樹的遍歷 25 分 給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。輸入格式 輸入第一行給出乙個正整數n 30 是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。輸出格式 在一行中輸出該樹的層序遍歷的序...

PTA 7 3 樹的同構 C語言判斷兩棵樹是否同構

題目出處 同構的定義 給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。圖一 圖二現給定兩棵樹,請你判斷它們是否是同構的。輸入格式...