當前位置:首頁 » 網路資訊 » 怎樣學習數據結構
擴展閱讀

怎樣學習數據結構

發布時間: 2022-01-27 01:35:44

1. 如何學習數據結構

很多計算機專業的同學對於大學2年級開設的數據結構課程很是頭痛.
看見大家總在談論數據結構重要性,可使自己學習卻總也找不到合適的方法.
下面我和大家分享一下我過去一年多以來學習和應用數據結構方面一些經驗.
內容都是來自作者本人的一些經歷和體驗,希望對於大家學習數據結構有引導作用。

1 什麼是數據結構
數據結構從文字上面來看,為數據和結構兩部分。這樣就很容易聯繫到數據結構的本質是一種對於數據結構花的知識。補充一個知識點,數據結構本質和離散數學有很密切的關系。離散數學是處理的是離散(非連續的)的數據,站在數據結構的觀點上來看,也可以理解是一種非連續數據的結構。

2 數據結構和程序設計語言
數據結構和程序設計語言本身沒有任何聯系,唯一有的關系就實用程序語言去描述數據結構。
因為數據結構是一種抽象數據,通過程序設計語言可以將在計算機中進行實現。今天大學里數據結構課程常用來描述數據結構的語言有C程序設計語言,C++程序設計語言和JAVA程序設計語言. 而對於喜歡其他語言的同學完全可以自己通過學習數據結構後用自己熟悉的程序設計語言去完成程序化的描述.
我自己過去很喜歡C#程序設計語言,自己用C#程序設計對於一些數據結構進行了實現.
大家可以通過訪問CSTC我的專欄看到兩篇C#描述的數據結構
3 數據結構學習的技巧
3.1 學習數據結構的概念後對於抽象數據類型的設計參考C++ STL標准庫中容器的設計.這樣對於無論是數據結構的學習還有程序設計介面能力上都會有很大的提高.
3.2 對於數據結構課程中很多時候都不太重視的順序(數組)做存儲的數據結構,希望大家還是要多留意這快的知識.對於有些場合需要考慮時間換空間的情況下需要考慮順序存儲結構.
3.3數據結構學習一定要自己獨立完成代碼實現,雖然有時候你理解內容了,但是實現上面還是會愈要很多困難的,解決這些困難會幫助你提高程序設計的能力的.

2. 怎樣學好數據結構

最好的方法就是用計算機語言——C,C++,Java等等,把裡面的數據結構和演算法實現了,那樣才是透徹的理解和運用。

3. 到底該如何學習數據結構

昨天買了本《大話數據結構》,之後就開始看。數據結構給我的印象就是一大堆code,自己實現很麻煩,而且很容易出detail errors,望著書上的代碼,我在想,難道我真要把他們都能獨自寫下來?其實想想怎麼也是不必的,說最低級的要求,工作中一下代碼然後會調用functions就OK了,更何況有C++的STL,另外在ACM這種競賽中,STL也是允許的,更何況可以帶material。而且即使自己都能獨自寫下來,那麼不常寫也多少會忘點細節方面的問題(比如錯誤處理漏條件),因為自己當時寫代碼不一定能想得那麼嚴謹。可見,那些代碼are not important,重要的還是思維。那些代碼只是develop your thinking的tools而已,並不是說要求你一定能全都write下來,當然,如果你understand it completely,那麼只要你的coding能力過關,那寫出代碼不在話下,只不過容易出現細節問題罷了,代碼上的細枝末節不是應該我們關注的東西。也就是說,那些實現性的代碼是幫助你學習的,但並非你的歸宿,你可以理解這個數據結構後使用代碼去describe你的想法,來驗證一下你是否真明白了,但不應該把是否能寫出代碼作為標准,相比之下,應該更強調對自身思維的培養和如何利用這個數據結構去做一些實際的事情。 劉汝佳在《演算法競賽入門經典》當中提到:一方面,很多常見數據結構已經包含於C++的STL或者Java的JCF中,不必自行編寫;另一方面,需要自己編寫的復雜數據結構在傳統教材是找不到的。換句話說,對於准備演算法競賽來說,傳統教材的最大價值在於概念和思想,而非代碼。在《演算法競賽入門經典》中,作者多次心中有劍,手中無劍,使用數組來模擬一些數據結構,比如用數組模擬二叉樹、模擬鏈表,這樣寫出的代碼十分簡潔,我看了之後才知道原來使用一個數據結構並不一定要把它的標准實現寫出來,我認為掌握數據結構的思想並能對實現進行靈活的變幻才是學習數據結構應該達到的目標和境界。 所以學習數據結構,我認為應該以讀書理解和做題為主,寫實現為輔。

4. 數據結構該怎麼學啊

如果你決定考研的話,建議把C學好。如果你打算工作,可以學學C#。
不知道你為什麼一開始就選擇了C#。還是慢慢來吧。好運!

5. 如何學習數據結構

學習數據結構首先,你要有一定的c語言基礎。

其次,要了解數據結構到底是什麼東西?數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索演算法和索引技術有關。

最後,了解幾項基本的常用結構,如:線性表,棧,隊列,二叉樹,圖等等。

在編寫演算法和程序之前,了解演算法的邏輯關系是非常重要的,比如棧後進先出的特點等等。

在編寫程序時,最好一步一步來,比如在編寫線性表的基本操作時,可以先編寫線性表的建立、初始化,然後先實現,如果沒有錯誤再繼續編寫,以免編寫全部之後錯誤太多無法改正。

6. 怎樣學好《數據結構》

<!--STATUS OK-->
<html>
<head>
<title>網路知道搜索_英語 繆語 </title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="/iknow1_0.css" rel="stylesheet" type="text/css">
<style>
#pg{font-size:14px;word-spacing:0px!important;word-spacing:4px;font-family:arial;text-align:left;height:30px;line-height:30px;margin:20px 0px}
.s{width:8%;padding-left:10px; height:25px;}
.f14{FONT-SIZE:14px}
.lklbe{color:#666666;}
a.lklbe:link,a.lklbe:visited{text-decoration:underline;color:#7777cc;}
.h5{height:5px;line-height:5px;}
.rga2,.rga4{right:-2px}
.tj2,.tj4{right:0px}
</style>
<script >
if (window.name == 'nw') { window.name = '';}
function ga(o,e){if (document.getElementById){a=o.id.substring(1); p = "";r = "";g = e.target;if (g)
{ t = g.id;f = g.parentNode;if (f) {p = f.id;h = f.parentNode;if (h) r = h.id;}} else{h = e.srcElement;f = h.parentNode;if (f) p = f.id;t = h.id;}if (t==a || p==a || r==a) return true;window.open(document.getElementById(a).href,'_blank')}}
function ss(w){window.status=w;return true;}
function cs(){window.status='';}

</script>
</head>
<body>
<div id="usrbar"><nobr><a href="http://..com/q?ct=24&cm=16&tn=ikusercenter#uscore" target="_blank"><strong>yhzking1991</strong></a> 初學弟子 一級(43)|<a href="/q?ct=24&cm=16&tn=ikusercenter#ask" target="_blank">我的提問</a>|<a href="/q?ct=24&cm=16&tn=ikusercenter#answer" target="_blank">我的回答</a>|<span id="mnum"></span>|<a href="http://www..com/">網路首頁</a>|<script language="javascript">document.write('<a href="http://passport..com/?logout&aid=7&u='+escape(location.href)+'">退出</a>');</script></nobr></div>

<!--開始-->
<table width="750" border="0" cellspacing="0" cellpadding="0" class="hd"><tr>
<td width="146" valign="top"><a href="/"><img src="https://gss0.bdstatic.com/70cFsjip0QIZ8tyhnq/img/logo-.gif" border="0" alt="網路知道" width="137" height="46" vspace="3"></a></td>
<td><div id="tab"><a href="http://news..com/ns?cl=2&rn=20&tn=news&word=%D3%A2%D3%EF+%E7%D1%D3%EF&t=1" class="headTit">新聞</a><a href="http://www..com/s?cl=3&wd=%D3%A2%D3%EF+%E7%D1%D3%EF" class="headTit">網頁</a><a class="headTit" href="http://post..com/f?kw=%D3%A2%D3%EF+%E7%D1%D3%EF&t=4">貼吧</a><font class="headTitB">知道</font><a class="headTit" href="http://mp3..com/m?tn=mp3&ct=134217728&lm=-1&word=%D3%A2%D3%EF+%E7%D1%D3%EF&t=2">MP3</a><a class="headTit" href="http://image..com/i?tn=image&ct=201326592&lm=-1&cl=2&word=%D3%A2%D3%EF+%E7%D1%D3%EF&t=3">圖片</a><a class="headTit" href="http://ke..com/w?ct=17&lm=0&tn=WikiSearch&pn=0&rn=10&word=%D3%A2%D3%EF+%E7%D1%D3%EF">網路</a></div>
<table border="0" cellspacing="0" cellpadding="0"><tr><form action="/q" name="ftop" method="get">
<td nowrap> <input class=hdi maxlength=256 tabindex=1 size=42 name=word value="英語 繆語"></td><td><a href="http://www..com/search/_help.html">幫助</a></td></tr></table>
<div style="margin-top:4px"><input type="submit" tabindex=2 value="搜索答案" class="bnsrh"><input type="hidden" name="ct" value="17"><input type="hidden" name="pn" value="0"><input type="hidden" name="tn" value="ikaslist"><input type="hidden" name="rn" value="10"><input type="button" onclick="ask(ftop);" tabindex=3 value="我要提問" class="bnsrh" style="margin-left:8px"></div>
</form>

<form name="fask" action="/q" method="get"> <input type="hidden" name="ct" value="17"><input type="hidden" name="pn" value="0"><input type="hidden" name="tn" value="ikask"><input type="hidden" name="rn" value="10"><input type="hidden" name="word" value=""> <input type="hidden" name="cm" value="1"><input type="hidden" name="lm" value="394496"><input type="hidden" name="qf" value="1">
</form>
</td></tr>
</table>
<script language="JavaScript">function ask(fn){document.fask.word.value=fn.word.value;fask.submit();}</script>
<!--結束-->

<div id="main">
<!--[if IE]>
<script language="JavaScript">
var objmain = document.getElementById("main");
function updatesize(){ var bodyw = window.document.body.offsetWidth; if(bodyw >= 1016) objmain.style.width="976px"; else objmain.style.width="782px"; }
updatesize(); window.onresize = updatesize;
</script>
<![endif]-->

<div class="path"><a href="/">網路知道</a> > 搜索結果</div>

<div id="subline"></div>
<div id="sub">

<span class="tba1"></span><span>已解決問題</span><span class="tba3"></span>
<a href="/q?ct=17&lm=65536&tn=ikaslist&pn=0&rn=10&word=%D3%A2%D3%EF+%E7%D1%D3%EF">待解決問題</a><span class="tbb2"></span>
<a href="/q?ct=17&lm=131072&tn=ikaslist&pn=0&rn=10&word=%D3%A2%D3%EF+%E7%D1%D3%EF">投票中問題</a><span class="tbb2"></span>

</div>
<div class="h5"></div>

<div id="right">

<div style="color:#666666;text-align:right;">共搜到相關問題 1 項</div>
<div class="h5"></div>
<div class="h5"></div>

</div>

<div id="center">

<table border=0 cellpadding=0 cellspacing=0><tr><td class=f><a href="/question/11313842.html?si=1" target=_blank><font size=3>《古詩》<font color=#C60A00>英語</font>怎麼樣說?</font></a>

<br><font size=-1>「古詩」和「歇後語」和<font color=#C60A00>繆語</font>,用<font color=#C60A00>英語</font>該怎麼樣說呢?</font><br><div class="lklbe"><a href="http://passport..com/?detail&aid=7&default_tab=2&un=%D0%C7%C2%DE%A4%CE%D0%C7%E8%A8" class="lklbe" target=_blank>星羅の星璦</a> - 2006-8-17 10:18 - 最佳回答者: <a href="http://passport..com/?detail&aid=7&default_tab=2&&un=%A6%A1%A6%A2%A6%A3%A6%A4%A6%A5%A6%A6" class="lklbe"
target=_blank>ΑΒΓΔΕΖ</a> - <a href="/browse/187?lm=9" class="lklbe">外語/出國</a></div></td></tr></table><br />

<div style="height:60px;width:100%;clear:both">

<table width="96%" height="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr><td style="font-size:14px;font-weight:bold;height:40px;width:70px;">相關搜索</td>

<td rowspan="2" valign="middle">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td nowrap class="f14"><a href="/q?word=%E7%D1%D3%EF&ct=17&pn=0&tn=ikaslist&rn=10&srs=1&srsod=0">繆語</a></td>
<td nowrap class="s"></td>
<td nowrap class="f14"><a href="/q?word=%D3%A2%D3%EF%B7%AD%D2%EB&ct=17&pn=0&tn=ikaslist&rn=10&srs=0&srsod=1">英語翻譯</a></td>
<td nowrap class="s"></td>
<td nowrap class="f14"><a href="/q?word=%D3%A2%D3%EF%CB%C4%BC%B6&ct=17&pn=0&tn=ikaslist&rn=10&srs=0&srsod=2">英語四級</a></td>

<td nowrap class="s"></td>
<td nowrap class="f14"><a href="/q?word=%D3%A2%D3%EF%D7%F7%CE%C4&ct=17&pn=0&tn=ikaslist&rn=10&srs=0">英語作文</a></td>
<td nowrap class="s"></td>
<td nowrap class="f14"><a href="/q?word=%D3%A2%D3%EF%D4%DA%CF%DF%B7%AD%D2%EB&ct=17&pn=0&tn=ikaslist&rn=10&srs=0">英語在線翻譯</a></td>
</tr>
<tr>
<td nowrap class="f14"><a href="/q?word=%D3%A2%D3%EF%CC%FD%C1%A6&ct=17&pn=0&tn=ikaslist&rn=10&srs=0">英語聽力</a></td>

<td nowrap class="s"></td>
<td nowrap class="f14"><a href="/q?word=%D3%A2%D3%EF%D1%A7%CF%B0&ct=17&pn=0&tn=ikaslist&rn=10&srs=0">英語學習</a></td>
<td nowrap class="s"></td>
<td nowrap class="f14"><a href="/q?word=%D0%C2%B8%C5%C4%EE%D3%A2%D3%EF&ct=17&pn=0&tn=ikaslist&rn=10&srs=0">新概念英語</a></td>
<td nowrap class="s"></td>
<td nowrap class="f14"><a href="/q?word=%D3%A2%D3%EF%B4%CA%B5%E4&ct=17&pn=0&tn=ikaslist&rn=10&srs=0">英語詞典</a></td>
<td nowrap class="s"></td>

<td nowrap class="f14"><a href="/q?word=%B7%E8%BF%F1%D3%A2%D3%EF&ct=17&pn=0&tn=ikaslist&rn=10&srs=0">瘋狂英語</a></td>
</tr>
</table>
</td></tr>
<tr><td></td></tr></table>

</div>
<div class="">
<div class="bg mt20 ">
<div class="rga1"></div><div class="rga2"></div>
<div class="p10" align="center">
<form action="/q" name="fbot" method="get">

<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td nowrap><input maxlength="256" tabindex=11 size="42" class="hdi" name=word value="英語 繆語"></td>
<td nowrap><a href="http://www..com/search/_help.html" target="_blank">幫助</a></td>
</tr>
<tr>
<td colspan="2">
<div style="margin-top:4px">
<input type="submit" tabindex=12 value="搜索答案" class="btn">
<input type="button" onclick="ask(fbot);" style="margin-left:8px" tabindex=13 value="我要提問" class="btn">
<input type="hidden" name="ct" value="17">
<input type="hidden" name="pn" value="0">
<input type="hidden" name="tn" value="ikaslist">
<input type="hidden" name="rn" value="10">

</div>

</td>
</tr>
</table>
</form>
</div>
<div class="">
<div class="rcb rga3"></div><div class="rga4"></div>
</div>
</div>
</div>
</div>
</div>

<script language="JavaScript">
var Msg_loopNum = 5;
function showMsg()
{
if(typeof redmsg != 'undefined') {
if (!redmsg || redmsg.length < 1) return;
document.getElementById('mnum').innerHTML = redmsg;
}else{
if(Msg_loopNum > 0) {setTimeout(function(){showMsg();},100);Msg_loopNum--;}
}
}

</script>
<script src="https://gsp0..com/8_UFsjip0QIZ8tyhnq/ms?ct=18&cm=3&tn=bmSelfUsrStat&mpn=13227114&un=yhzking1991"></script>

<SCRIPT>showMsg();</SCRIPT>

<div id="ft">&;2007 Bai</div>

<img src="http://c..com/c.gif?t=2&q=%D3%A2%D3%EF+%E7%D1%D3%EF&p=0&pn=1" style="display:none;"/>
</body>
</html>

7. 怎麼學好數據結構

數據結構作為大學計算機相關專業的學生來說是一門十分重要的課程,無論是以後演算法思想的滲透,還是工作中程序代碼的處理,都離不開數據結構的影子。但是因為數據結構知識較多,並且比較抽象,對於很多人來說學它就感到頭疼。其實大可不必,數據結構的學習自然有其對應的方法。

還有一點,要想學習好數據結構,好的課程是必不可少的,如果大學老師講的足夠好的話完全可以帶你領略數據結構的美麗風景,如果你想自學成才的話,推薦浙江大學陳越姥姥的課和清華大學鄧俊輝老師的課,都十分透徹易懂。

8. 如何學好數據結構

(轉)
前面的話:輕舟曾經熱衷於把自己復習時候遇到的問題和總結的經驗分享給大家,不過
來了交大以後,發現這里卧虎藏龍,自己只不過是溪底小蝦一個。於是放棄了以前出數
據結構筆記的打算,不過,最近又有許多同學問起我數據結構的事情,這里就把以前總
結的筆記的前言帖出來,但絕對不會有後續部分,希望大家見諒。

學習數據結構這門課程至少要經歷三個過程,方可真正
的掌握這門課程,得到一個滿意的成績。這個過程簡單來說就是三個字:活→死→活。
首先,是一個學「活」的過程,就要要求我們對書中的每一個演算法,能夠在腦海中
建立起相應的模型,而不是死板的演算法。比如樹的遍歷非遞歸演算法,在入棧與出棧的過程
中,我們就要在腦海中形成訪問樹每個結點的過程,真正掌握住這個演算法。這樣,全書復
習下來,你的腦海中就有了整個數據結構的模型概念,對任何一個陌生的演算法,將不感到
生疏和害怕。
有些同學到了此處就覺得數據結構已經學好,可以萬事大吉了,其實這還遠遠不夠
,如果參加考試,往往會拿不到高分,甚至還會納悶,為何自己數據結構學的這樣好,成
績卻不盡如人意,因此產生了批卷老師判錯的想法。所以第二個過程,就是一個學「死」
的過程,這個過程要求,要記住書中的演算法(功利一點就是要背誦會所報考學校的考試要
求的演算法)。有的學校有別的特殊要求,也一並背會。如上海交通大學喜歡考平均復雜度
的分析這樣的題目,我們在書上可以找到這樣的分析一共十一個,全部背會,就免去了在
考場上分析的麻煩,如果連答案都能記住,那麼,也不會因為粗心失分了。這一過程也許
有些枯燥,但卻是最重要的過程,比如說背會了樹的後序遍歷非遞歸,遇到了像求某個結
點的所有祖先,兩個結點的共同祖先這樣的題,不用想,直接套用。這樣才是考試的高分
的關鍵:在考場上,遇到考題,不用思考,直接從腦海中找匹配的演算法,直接引用。
有了第二個過程的辛苦,我們就可以得到一個比較高的分數了,如果還想提高,就
要進行第三個過程,再學「活」的過程。這一個過程中就要要求我們,在第二步的基礎上
,多進行思考,看看有哪些演算法有共性,比如說:樹的前序非遞歸遍歷演算法和圖的深度優
先遍歷演算法是不是類似啊,有些什麼不同,有些什麼相同,為什麼會相同;森林轉化為二
叉樹和圖的生成樹的演算法也是這樣,等等。總結出這種共性,這樣就能正確有效的記憶算
法,同時,遇到難題不至於慌亂,能夠從容下手解題。
對於總結共性問題上,這里舉一小個例子,(呵呵,我當初總結出這個,並且和ka
oyan.com斑竹一具討論確定後三天,就在2002年交大第一題考出類似東東)比如樹的遍
歷,不管是遞歸還是非遞歸
,也不管是線索樹,還是頭結點有父母信息的樹,它的遍歷其實就是一個尋找到遍歷的第
一個結點,然後再尋找它的後繼結點的過程,我們歸納到此處,就可以試著總結一下三種
遍歷的後繼結點是哪個,有幾種情況:
對於前序遍歷,它的後繼如下:
(1)若有左孩子,則後繼是左孩子;
(2)若無左孩子,有右孩子,則後繼是右孩子;
(3)若既無左孩子,又無右孩子,則是一片葉子;再討論:
(a)若是其父母的左孩子,且父母有右孩子,則後繼是父母的右孩子。
(b)若是其父母的左孩子,且父母無右孩子;
(c)若是其父母的右孩子。
b,c都表示這是某個節點的左子樹前序遍歷的最後一個節點,則需要找第一個有右子
樹的「左祖先」(定義「左祖先」,即找第一個使得當前節點在這個祖先的左子樹上),
然後後繼就是這個祖先的右孩子。
對於中序遍歷,它的後繼如下:
(1)如有右孩子,後繼是右孩子的最左下節點;
(2)若無右孩子,且是父母的左孩子,則後繼就是父母;
(3)若無右孩子,且是父母的右孩子,則一直上溯到第一個「左祖先」(定義如前)
則後繼就是這個祖先。若無這樣的祖先,說明已經遍歷完畢。
對於後序遍歷,它的後繼如下:
(1)若是父母的右孩子,則後繼是父母;
(2)若是父母的左孩子,且父母無右子樹,則後繼是父母;
(3)若是父母的左孩子,父母有右子樹,則後繼是父母右子樹的最先訪問到的節點(
指向父母的右子樹後,一直往左,若不行的話,往右一步,一直到葉子)
總結完了,想一想,我們還能得到哪些提示?經常有一類型題目,要求求某個結點
的直接前驅。其實求前序遍歷的前驅和求後序遍歷的後繼是一樣的,只不過把左換成右而
已,前序遍歷的求後繼和後序遍歷的求前驅、中序遍歷的求前驅和中序遍歷求後繼都有這
樣的對稱關系。因此,總結出共性的東西,許多題目就可以迎刃而解了。問一問讀到這里
的讀者,你現在能夠自己在腦子裡面,非常輕松地像上面那樣,把這個例子裡面的情況都
條理清楚地分析總結出來嗎?如果現在還不行,到考試之前,你必須掌握到這種程度,才
能得到一個自己很滿意的分數。
經過以上的三個過程復習,相信讀者對數據結構的掌握就可以到達比較高的水平了
,如果參加考試,獲得一個比較滿意的成績也很有希望了。當然,達到這一
步並不容易,大量的練習是真正掌握的必由之路。因此,我們建議大家能夠下功夫把本書
中的題目完整地做一遍。能夠真正把本書中的所有題都掌握,絕不僅僅意味著僅會了書中
這幾百道題目,而是意味著對數據結構這門課程的理解,以及對問題的分析能力都有很大
的提高,這樣在考場上即使遇到未曾見過的題目,也就可以從容應對了!

9. 如何學好數據結構

數據結構是學好程序設計的基礎 裡面寫了一些常用的演算法和數據結構

參加acm很有用 對以後找工作 面試都很有用

數據結構 一般面試過程中 問的就是堆棧等等問題

學好數據結構 首先得弄明白概念 然後就是上機實驗了

每種類型的演算法你都必須很熟練地敲出來

這里比較難懂的就是遞歸 和回溯的一些問題了

這個一定要學好

還有圖論那個地方的知識很難 什麼最短路徑問題 等等

學好數據結構很不容易

要下苦功夫

可以看看麻省理工的 課本 introction to algorithm

還可以看看 the art of computer programming

10. 怎樣才能學好數據結構

一時間也寫不出太具體的方法 就在網上為你找了一個前輩發的帖子 你看一下,肯定比我寫的好。

-------------------------

學習數據結構這門課程至少要經歷三個過程,方可真正
的掌握這門課程,得到一個滿意的成績。這個過程簡單來說就是三個字:活→死→活。
首先,是一個學「活」的過程,就要要求我們對書中的每一個演算法,能夠在腦海中
建立起相應的模型,而不是死板的演算法。比如樹的遍歷非遞歸演算法,在入棧與出棧的過程
中,我們就要在腦海中形成訪問樹每個結點的過程,真正掌握住這個演算法。這樣,全書復
習下來,你的腦海中就有了整個數據結構的模型概念,對任何一個陌生的演算法,將不感到
生疏和害怕。
有些同學到了此處就覺得數據結構已經學好,可以萬事大吉了,其實這還遠遠不夠
,如果參加考試,往往會拿不到高分,甚至還會納悶,為何自己數據結構學的這樣好,成
績卻不盡如人意,因此產生了批卷老師判錯的想法。所以第二個過程,就是一個學「死」
的過程,這個過程要求,要記住書中的演算法(功利一點就是要背誦會所報考學校的考試要
求的演算法)。有的學校有別的特殊要求,也一並背會。如上海交通大學喜歡考平均復雜度
的分析這樣的題目,我們在書上可以找到這樣的分析一共十一個,全部背會,就免去了在
考場上分析的麻煩,如果連答案都能記住,那麼,也不會因為粗心失分了。這一過程也許
有些枯燥,但卻是最重要的過程,比如說背會了樹的後序遍歷非遞歸,遇到了像求某個結
點的所有祖先,兩個結點的共同祖先這樣的題,不用想,直接套用。這樣才是考試的高分
的關鍵:在考場上,遇到考題,不用思考,直接從腦海中找匹配的演算法,直接引用。
有了第二個過程的辛苦,我們就可以得到一個比較高的分數了,如果還想提高,就
要進行第三個過程,再學「活」的過程。這一個過程中就要要求我們,在第二步的基礎上
,多進行思考,看看有哪些演算法有共性,比如說:樹的前序非遞歸遍歷演算法和圖的深度優
先遍歷演算法是不是類似啊,有些什麼不同,有些什麼相同,為什麼會相同;森林轉化為二
叉樹和圖的生成樹的演算法也是這樣,等等。總結出這種共性,這樣就能正確有效的記憶算
法,同時,遇到難題不至於慌亂,能夠從容下手解題。
對於總結共性問題上,這里舉一小個例子,(呵呵,我當初總結出這個,並且和ka
oyan.com斑竹一具討論確定後三天,就在2002年交大第一題考出類似東東)比如樹的遍
歷,不管是遞歸還是非遞歸,也不管是線索樹,還是頭結點有父母信息的樹,它的遍歷其實就是一個尋找到遍歷的第
一個結點,然後再尋找它的後繼結點的過程,我們歸納到此處,就可以試著總結一下三種
遍歷的後繼結點是哪個,有幾種情況:
對於前序遍歷,它的後繼如下:
(1)若有左孩子,則後繼是左孩子;
(2)若無左孩子,有右孩子,則後繼是右孩子;
(3)若既無左孩子,又無右孩子,則是一片葉子;再討論:
(a)若是其父母的左孩子,且父母有右孩子,則後繼是父母的右孩子。
(b)若是其父母的左孩子,且父母無右孩子;
(c)若是其父母的右孩子。
b,c都表示這是某個節點的左子樹前序遍歷的最後一個節點,則需要找第一個有右子
樹的「左祖先」(定義「左祖先」,即找第一個使得當前節點在這個祖先的左子樹上),
然後後繼就是這個祖先的右孩子。
對於中序遍歷,它的後繼如下:
(1)如有右孩子,後繼是右孩子的最左下節點;
(2)若無右孩子,且是父母的左孩子,則後繼就是父母;
(3)若無右孩子,且是父母的右孩子,則一直上溯到第一個「左祖先」(定義如前)
則後繼就是這個祖先。若無這樣的祖先,說明已經遍歷完畢。
對於後序遍歷,它的後繼如下:
(1)若是父母的右孩子,則後繼是父母;
(2)若是父母的左孩子,且父母無右子樹,則後繼是父母;
(3)若是父母的左孩子,父母有右子樹,則後繼是父母右子樹的最先訪問到的節點(
指向父母的右子樹後,一直往左,若不行的話,往右一步,一直到葉子)
總結完了,想一想,我們還能得到哪些提示?經常有一類型題目,要求求某個結點
的直接前驅。其實求前序遍歷的前驅和求後序遍歷的後繼是一樣的,只不過把左換成右而
已,前序遍歷的求後繼和後序遍歷的求前驅、中序遍歷的求前驅和中序遍歷求後繼都有這
樣的對稱關系。因此,總結出共性的東西,許多題目就可以迎刃而解了。問一問讀到這里
的讀者,你現在能夠自己在腦子裡面,非常輕松地像上面那樣,把這個例子裡面的情況都
條理清楚地分析總結出來嗎?如果現在還不行,到考試之前,你必須掌握到這種程度,才
能得到一個自己很滿意的分數。
經過以上的三個過程復習,相信讀者對數據結構的掌握就可以到達比較高的水平了
,如果參加考試,獲得一個比較滿意的成績也很有希望了。當然,達到這一
步並不容易,大量的練習是真正掌握的必由之路。因此,我們建議大家能夠下功夫把本書
中的題目完整地做一遍。能夠真正把本書中的所有題都掌握,絕不僅僅意味著僅會了書中
這幾百道題目,而是意味著對數據結構這門課程的理解,以及對問題的分析能力都有很大
的提高,這樣在考場上即使遇到未曾見過的題目,也就可以從容應對了!