演算法筆記 靜態鍊錶實現樹的同構判斷

2021-09-22 02:09:34 字數 2819 閱讀 8751

按照課程講解的思路來寫,邏輯關係能夠理解清楚了,但是實際執行起來實在是有問題,雖然在pta上能夠通過。但是我自己看不出問題來,並且,看了一遍又一遍仍然看不出來!(可能自己太笨。。)這就說明有著很嚴肅的問題!

所以,與其這樣糾結,不如按照自己理解的思路來寫一遍

給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是「同構」的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a、b、g的左右孩子互換後,就得到另外一棵樹。而圖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 #include //按題目的意思,儲存樹的是靜態鍊錶

//即建乙個結構,裡面三個變數char型結點字母,int型的左右孩子的位置

#define maxtree 10 //題目的意思:最多十個結點

#define elementtype char

#define tree int

#define null -1

tree buildtree(struct treenode t);

int isomorphic(tree r1, tree r2);

//建乙個二叉樹的結構,並用陣列的元素指向該結構

struct treenode

t1[maxtree], t2[maxtree];

//這樣就可以直接按題目要求進行逐行讀入了

//程式的整體框架

int main()

//建二叉樹

//1、將結點、左右孩子的位置讀入陣列結構

//2、通過遍歷陣列,找出頭結點

//沒有其他結點指向的就是頭結點,所以可以用乙個標誌

tree buildtree(struct treenode t)

; char cl, cr; //因為有'-'存在,所以先用char型變數暫存,然後再放到結構裡

scanf("%d\n", &n);

if (n)

else

t[i].left = null;

if (cr != '-')

else

t[i].right = null;

}//最後遍歷一遍結構陣列,isnode為0的就是頭結點

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

}return null;

}//下面來判斷是否為同構

//都為空樹,直接返回1;乙個空乙個不空,直接返回0

//都不空:結點不同,直接0;結點相同,再看子樹

//左子樹同不存在,就遞迴呼叫右子樹

//左子樹存在,看是否相等,不相等就交換左右子樹,再遞迴呼叫

int isomorphic(tree r1, tree r2)

#include #include #define maxtree 10

#define null -1

struct treenode

t1[maxtree], t2[maxtree];

int madetree (struct treenode t);

int isomorphic(int r1, int r2);

int main()

int madetree(struct treenode t)

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

else

t[i].left = null;

if (r != '-')

else

t[i].right = null;

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

}return null;

}int isomorphic(int r1, int r2)

但是這樣寫,好像並沒有什麼本質的區別,和照抄沒啥兩樣……

然後本地執行還是有問題:不是正常的回車結束。

暫時還沒想明白是啥問題,應該是輸入輸出有關。​

演算法筆記 靜態鍊錶

靜態鍊錶的實現原理是hash,通過建立乙個結構體陣列,並令陣列的下標直接表示節點的位址,來達到直接訪問陣列中的元素就能訪問節點的結果。靜態鍊錶不需要頭節點。includestruct nodenode size 由於可能要使用sort函式,在使用靜態鍊錶時盡量不要把結構體型別名和結構體變數名取成相同...

靜態鍊錶的實現

include include define size 6 define struct of static list typedef struct stlist stlist 初始化靜態鍊錶分配空間大小為size個 stlist initlist stlist tempptr of for i in...

靜態鍊錶的實現

用陣列來代替指標,來描述單鏈表 將陣列元素分成兩個資料域,data和cur。data用來存放資料元素,cur存放該元素的後繼在陣列中的下標 游標 游標實現法 線性表的靜態鍊錶儲存結構 define maxsize 1000 typedef struct component,staticlinklis...