樹的同構(25 分)

2021-08-09 23:00:25 字數 1669 閱讀 6445

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

圖1

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

輸入給出2棵二叉樹樹的資訊。對於每棵樹,首先在一行中給出乙個非負整數

n (≤),即該樹的結點數(此時假設結點從0到n−

1編號);隨後

n行,第

i行對應編號第

i個結點,給出該結點中儲存的1個英文大寫字母、其左孩子結點的編號、右孩子結點的編號。如果孩子結點為空,則在相應位置上給出「-」。給出的資料間用乙個空格分隔。注意:題目保證每個結點中儲存的字母是不同的。

如果兩棵樹是同構的,輸出「yes」,否則輸出「no」

先找到根節點,然後根據根節點,同時遞迴兩棵樹,如果不符合調節返回就可以,還有注意就是乙個事情,自己一開始沒有想到,就是這棵樹只有左結點,類似一條直線。

其實有乙個更簡單的做法,就是不斷用vector的二維陣列存每個結點子結點,然後利用vector的 == 過載,就可以直接判斷,對應結點的子結點是否相通,就可以判斷是否是同構的了

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

using namespace std;

const int inf = 0x3f3f3f3f;

const int maxn = 1000 + 10;

int dir[4][2] = ,,,};

int root1,root2;

struct treenode

};vectortb1;

vectortb2;

int vis1[maxn];

int vis2[maxn];

int n,m;

int ans;

void init()

int judge(int a,int b)

int main()

else

if(c != '-')

else

tb1.push_back(treenode(a,left,right));

}for( int i = 0; i < n; i++)

}scanf("%d",&m);

if(n != m)

init();

for(int i = 0; i < m; i++)

else

if(c != '-')

else

tb2.push_back(treenode(a,left,right));

}for( int i = 0; i < m; i++)

}if(judge(root1,root2))

{cout<

樹的同構 (25 分

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

5 3 樹的同構 25分

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

7 10 樹的同構(25 分)

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