二叉樹
A
/ /
B C
/ / /
D E F
先序遍歷(前序遍歷,先根便利)
如果非空,先訪問根節點,再先序遍歷左子樹,最後先序遍歷右子樹,即NLR。
A->B->D->C->E->F
中序遍歷(中根便利)
如果非空,先中序遍歷左子樹,再訪問根節點,最後中序遍歷右子樹,即LNR。
D->B->A->E->C->F
後序遍歷(後根便利)
如果非空,先後序遍歷左子樹,再後序遍歷右子樹,最後訪問根節點,即LRN。
D->B->E->F->C->A
C代碼:
哈希表
一點思考:
哈希表、樹、鏈表存儲都有兩種方式:局部變量和申請內存。前者適合比較小數據的存儲,優點是不用維護內存,後者是和大容量存儲,但要記得free。
有兩個問題需要注意:
一、我們操作的時候,經常聲明個局部變量,然後把它掛到表上去,類似pstNode->pstNext = &XXX,但是有沒有想過當這個人函數彈出了,局部變量也就銷毀了,如果表沒了,也就罷了,如果表還在,會有什麼後果?——很嚴重,你掛在表上的數據已經不是那個變量了!
解決辦法:
1、不要掛局部變量,malloc一塊內存,掛上去;
2、掛全局變量;
3、如果非要掛局部變量,保證其生命週期與表相同,或者比表還長。
一般使用第一種方法,全局變量謹慎使用,佔內存。
二、掛了個局部變量到表上去,銷毀表的時候(不管局部變量生命週期是否結束)free這些節點。
問題又來了,掛上去的局部變量又不是malloc的,怎麼能free呢?malloc和free一定是成對使用的。
解決辦法:
1、全部使用malloc,不掛什麼變量,不管是局部的還是全局的;
2、全部掛局部變量,不釋放,等函數結束後自動銷毀。
一般都使用第一種方法。如果執意要混合使用,就等著出問題吧。。。
冒泡排序:
快速排序: