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