很多同学都说,数据结构不好学。个人认为,学习的难易程度很大程度上决定于个人的兴趣。把一件事情当做任务去做会很痛苦,当做兴趣去做会很快乐。如果想让自己在学习数据结构的过程中更轻松一些,请先培养对这门学科的兴趣。
以下是我学习数据结构的几点心得体会,希望可以给大家带来帮助。
一、 构建知识框架
不管学习什么,概念是基础,所有的知识框架都是建立在基础概念之上的。所以,第一遍看课本要将概念熟记于心,然后构建知识框架。数据结构包括线性结构、树形结构、图状结构或网状结构。线性结构包括线性表、栈、队列、串、数组、广义表等,栈和队列是操作受限的线性表,串的数据对象约束为字符集,数组和广义表是对线性表的扩展:表中的数据元素本身也是一个数据结构。除了线性表以外,栈是重点,因为栈和递归紧密相连,递归是程序设计中很重要的一种工具。树状结构中的重点自然是二叉树和哈弗曼树了。对于二叉树的很多操作都是基于对二叉树的遍历,掌握了如何遍历,很多问题也就迎刃而解了,比如对二叉树结点的查找访问、统计二叉树中叶子结点的数目、求二叉树的深度等。哈弗曼编码也有着很广泛的应用。对于图状结构,主要学习图的存储结构及图的遍历。
二、 对算法的学习
个人认为,对算法的学习是学习数据结构的关键。在第二遍看课本的过程中,要注重对算法的掌握。对于一个算法,读一遍可能能读懂,但不可能完全领会其中的思想。掌握一个算法,并不是说将算法背过,而是掌握算法的思想。我们需要的是耐心。每看一遍就会有这一遍的收获。读懂算法之后,自己再默写算法,写到不会的地方,看看课本想想自己为什么没有想到。反复练习,直到能顺利写出算法为止。个人认为,这是行之有效的方法。这样,不仅可以更加深入的领会算法思想,还会逐渐发现算法的巧妙之处,从而对数据结构产生兴趣。
三、 对算法的应用
学习算法的目的是利用算法解决实际问题。会写课本上已有的算法之后,可以借其思想进行扩展,逐步提高编程能力。比如数值转换,括号匹配的检验,检验平衡二叉树等。
以下是我在学习数据结构的过程中写的关于二叉树遍历及其应用的算法:
(1)二叉树遍历
void PreOrderTraverse(BiTree T){
if(T) {
Visit(T->da
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
(2)应用
对二叉树遍历的应用,实际上就是对visit访问函数的不同定义。
统计结点数目:
void Num(BiTree T,int &num){
if(T){
num++;
Num(T->lchild,num);
num(T->rchild,num);
}
}
统计叶子结点的数目:
void CountLeaf(BiTree T,int &count){
if(T){
if((!T->lchild)&&(!T->rchild))
count++;
CountLeaf(T->lchild,count);
CountLeaf(T->rchild,count);
}
}
统计二叉树的深度:
int Depth(BiTree T){
if(!T)
depthval=0;
else{
depthLeft=Depth(T->lchild);
depthRight=Depth(T->rchild);
depthval=1+(depthLeft>depthRight?depthLeft:depthRight);
}return depthval;
}
复制二叉树:
BiTree GetNode(TElemType item,BiTree lp,BiTree rp){
if(!(T=(BiTree)malloc(sizeof(BiTNode)))) return ERROR;
T->date=item;
T->lchild=T->rchild=NULL;
return T;
}
BiTree CopyTree(BiTree T){
if(!T) return NULL;
if(T->lchild)
lptr=CopyTree(T->lchild);
else lptr=NULL;
if(T->rchild)
rptr=CopyTree(T->rchild);
else rptr=NULL;
newnode=GetNode(T->date,lptr,rptr);
return newnode;
}
数据结构是实践很强的一门课程,光是“听”和“读”是绝对不够的,必须加强实践。在写算法的过程中,可能会出现很多问题,而不断修改的过程便是学习的过程。在这个过程中,只要全身心的投入了,便会发现很多乐趣。