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)若是父母的左孩子,父母有右子树,则后继是父母右子树的最先访问到的节点(
指向父母的右子树后,一直往左,若不行的话,往右一步,一直到叶子)
总结完了,想一想,我们还能得到哪些提示?经常有一类型题目,要求求某个结点
的直接前驱。其实求前序遍历的前驱和求后序遍历的后继是一样的,只不过把左换成右而
已,前序遍历的求后继和后序遍历的求前驱、中序遍历的求前驱和中序遍历求后继都有这
样的对称关系。因此,总结出共性的东西,许多题目就可以迎刃而解了。问一问读到这里
的读者,你现在能够自己在脑子里面,非常轻松地像上面那样,把这个例子里面的情况都
条理清楚地分析总结出来吗?如果现在还不行,到考试之前,你必须掌握到这种程度,才
能得到一个自己很满意的分数。
经过以上的三个过程复习,相信读者对数据结构的掌握就可以到达比较高的水平了
,如果参加考试,获得一个比较满意的成绩也很有希望了。当然,达到这一
步并不容易,大量的练习是真正掌握的必由之路。因此,我们建议大家能够下功夫把本书
中的题目完整地做一遍。能够真正把本书中的所有题都掌握,绝不仅仅意味着仅会了书中
这几百道题目,而是意味着对数据结构这门课程的理解,以及对问题的分析能力都有很大
的提高,这样在考场上即使遇到未曾见过的题目,也就可以从容应对了!