給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是「同構」的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a、b、g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。
圖1圖2
現給定兩棵樹,請你判斷它們是否是同構的。
輸入格式:
輸入給出2棵二叉樹樹的資訊。對於每棵樹,首先在一行中給出乙個非負整數n (≤10),即該樹的結點數(此時假設結點從0到n−1編號);隨後n行,第i行對應編號第i個結點,給出該結點中儲存的1個英文大寫字母、其左孩子結點的編號、右孩子結點的編號。如果孩子結點為空,則在相應位置上給出「-」。給出的資料間用乙個空格分隔。注意:題目保證每個結點中儲存的字母是不同的。
輸出格式:
如果兩棵樹是同構的,輸出「yes」,否則輸出「no」。
輸入樣例1(對應圖1):
8a 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 -
輸出樣例1:
yes輸入樣例2(對應圖2):
8b 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
輸出樣例2:
no
#include
using
namespace std;
//用結構陣列表示二叉樹
struct streenode
t1[10
],t2[10]
;int
biuldtree
(struct streenode t)
;int
isthesamestruct
(int
,int);
intmain()
intbiuldtree
(struct streenode t)
else t[i]
.left =-1
;//左邊沒兒子,就把左兒子設為-1`在這裡插入**片`
if(cr !=
'-')
else t[i]
.right =-1
;}}else
return-1
;//與根節點初始化為-1的目的一樣,當輸入空樹的時候保證根節點編號為-1,兩者寫其中乙個就行。
for(
int i =
0; i < n;i++
)//是別的兒子的check都是1.還是0的那個就是根節點
}return root;
//返回根節點編號
}int
isthesamestruct
(int r1,
int r2)
if(t1[r1]
.left==-1
&&t2[r2]
.left==-1
)//兩棵樹的根節點左兒子都是空的if(
(t1[r1]
.left !=-1
&& t2[r2]
.left !=-1
)&&(t1[t1[r1]
.left]
.contents == t2[t2[r2]
.left]
.contents)
)//兩棵樹的做兒子不同時為空並且左兒子的內容相等
else
return
isthesamestruct
(t1[r1]
.right, t2[r2]
.left)
&&isthesamestruct
(t1[r1]
.left, t2[r2]
.right)
;//兩棵樹的左兒子不同時為空且左兒子內容不相等,那麼有可能是
//左邊等於右邊,右邊等於左邊
}
判別二叉樹T是否為完全二叉樹
判別二叉樹t是否為完全二叉樹 定義 深度為k且含有n個結點的二叉樹,如果其每個結點都與深度為k的滿二叉樹中的編號從1到n的結點一一對應,則成為完全二叉樹。判斷條件 1.左 右子樹都是完全二叉樹 2.左子樹的高度和右子樹一樣或大1 3.若左子樹比右子樹高度大1,則右子樹必須是滿的 節點數等於2 高度 ...
C 實現二叉樹
其中的 linkstack.h 和 linkqueue 分別在 以下兩篇博文裡 linkstack linkqueue include include linkstack.h include linkqueue.h using namespace std 定義節點 templatestruct no...
二叉樹C 實現
最近整理原來的一些 腦子有點不好使,還是記下來吧。binary tree.h,遍歷包含了遞迴和非遞迴兩種,層次遍歷 ifndef binary tree h define binary tree h templatestruct binode templateclass bitree endif b...