給定兩棵樹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棵二叉樹樹的資訊。...