我是「電腦科學與技術」專業的一名在校本科生,這是我的第一篇博文,用詞不當還請各位看官多多包涵。
這篇博文是關於西北工業大學noj資料結構習題中的「求廣義表深度」的思路實現與除錯心得,如有錯誤或紕漏歡迎各位大佬指正。
題目如下:
讀題之後,第一反應是與之前做過的一道「表示式括號匹配」題目類似,似乎可以用「棧」的方法來解決,但題目明確要求要用廣義表而且老師前兩天也剛剛講過關於廣義表的遞迴運算,所以我決定使用遞迴來將資料存入廣義表,再使用遞迴來計算出該廣義表的深度。
構建廣義表的思路是通過判斷每次輸入的字元來判斷需要新生成什麼樣的節點,再通過上一節點資訊來判斷當前節點應連線在表的什麼位置;計算廣義表深度的思路是通過判斷該節點的資訊,計算出後面與下面所有節點深度最大乙個,形成遞迴,最終返回改廣義表的深度。
首先設計出節點的資料型別,「judge」用來判斷此節點型別,1是「data節點」,0是「node節點」;「before」是指向上乙個節點指標;「next」是指向右側節點的指標;紅框內是union型的資料,為「data節點」時是存入的資料,為「node節點」時是指向下面節點的指標。
由此可以將(a,(b,c))轉變為所設計的廣義表:同級的a與bc同行,同級的b與c同行,每個「node節點」的down所在行的每一節點就是該括號內的所有資料,如下圖:
而我計算深度的方法是不斷將節點右側和下方的深度計算出來,取其中最大的深度,如下圖:
我的實現如下:
#include #include struct node;};
void creategeneralnode (struct node *pre);
void creategenerallist (struct node *head);
void run ();
int getdepth (struct node *node);
int main()
void creategeneralnode (struct node *pre)
if (s>='a'&&s<='z')
else
cur->before=pre;
cur->data=s;
cur->next=null;
cur->judge=1;
creategeneralnode (cur);
}else
else
cur->before=pre;
cur->down=null;
cur->next=null;
cur->judge=0;
creategeneralnode (cur);
}else
creategeneralnode (pre);}}
}}void creategenerallist (struct node *head)
void run ()
int getdepth (struct node *node)
else
else
}max=depth>max?depth:max;
}if (node->judge)
else
else
}return max=depth>max?depth:max;
}
其函式呼叫關係如下:
以下是各函式注釋**:
void run ()
void creategenerallist (struct node *head)
if (s>='a'&&s<='z')
else //如果與上乙個節點不同行
cur->before=pre; //該date節點賦值
cur->data=s;
cur->next=null;
cur->judge=1;
creategeneralnode (cur);//遞迴,重新建立節點
}else
else //如果不同行
cur->before=pre; //node節點賦值
cur->down=null;
cur->next=null;
cur->judge=0;
creategeneralnode (cur);//重新建立節點
}else
creategeneralnode (pre);//重新建立節點}}
}}
int getdepth (struct node *node)
else
else
}max=depth>max?depth:max;
}if (node->judge) //遍歷下方節點,尋找其中最大深度
else
else
}return max=depth>max?depth:max;//返回兩側深度較大的值
}
輸入函式我重寫了兩次才完成,都是因為判斷條件不完善導致無法得到正確的廣義表,下次在設計時需要考慮周全,避免無意義的返工。
測深度的方法想了好久,也參考了老師的方法(其實是沒看懂。。。),主要原因還是對遞迴的理解不夠透徹,無法直接想出所需的遞迴演算法。
第一次寫的博文,寫了很長時間,已經快三點了。。。下次我一定盡量在白天寫,希望自己能堅持下來。
NOJ 計算二叉樹葉子節點數目 西工大資料結構
今天晚上沒啥事,洗了洗澡,吃了點東西,又寫了一道,感覺和上一道比較類似。題目如下 分析一下題目,它是將乙個先序的一串資料整到二叉樹裡,再找出它的葉節點有幾個。輸入我決定採用遞迴的方法,每次讀入乙個資料,若是字母說明他是乙個根節點,若是 說明上個節點沒有當前分支,返回null即可。由此,ab 可轉換成...
NOJ 二叉排序樹的插入和刪除 西工大資料結構
周二就寫完了,找bug找了很長時間,今天有空了,發出來。題目如下 構建二叉排序樹,找後繼線索鍊錶,插入都還可以,基本操作,就是這個刪除比較麻煩,好多種情況,而且他居然每次都是對原二叉樹進行插入刪除,輸出之後還得刪除和插入回去,真的是閒的。找後繼採用棧的方法就可以了,插入就和查詢差不多,只不過插入是找...
NOJ 二叉排序樹的歸併 西工大資料結構
題目如下 我就隨便寫了寫,還用的上次的函式就可以。以下是我的實現 include include struct binarytreenode struct binarytree void run struct binarytreenode createnewtree struct binarytre...