前言:《数据结构》作为计算机专业的一门重点学科,无论是将来考研、就业,对其的考察都是重中之重,之前的文章已经对此进行过论述。作为考察程序员“编程能力”的一种方式,考验的是我们如何将数据结构的思想用编程语言精确的编码出来。所有的《数据结构》课本都详细的讲解了每一种数据结构和算法的思想,然后给出具体的编程语言代码或者伪代码。算法思想只要认真看书,还是比较容易掌握的 ,真正考验我们的,是从算法思想到具体编码的这个思考过程,就是思考如何编码实现,这个过程是逃不掉的,除非参考别人的现有代码,但一段时间过后一定会忘记(百分之百的,我就忘记了无数次了)。所以,尽量在编程实现前,自己有个清晰的思路,尝试着自己去实现。
代码
代码托管在github ,需要的可以下载或者直接复制代码运行,只有一个cpp文件。已经通过测试,完全没有问题。这里重点是实现算法思想,所以没有考虑代码的健壮性,没有异常处理。
定义二叉树的节点
|
|
二叉树的节点定义很简单,采用结构体,一个数据域和两个指针域。但有一个问题是让我不解的,就是为什么在typedef时要采用两种方式,而且我看过的所有课本中,无一例外的都采用了这两种方式(在链表的定义中也是如此)。我试验只采用第一种,完全没任何问题。我去网上搜索,也没人给出答案。看到这篇文章的同学,如果知道的话,希望在简书留言告诉我!
二叉树的建立
思路:一般的题目中,都是直接告诉我们有一棵二叉树,直接让我们进行各种遍历,让我们从零创建一棵树的还真不多见。仔细想想,思路还真不是那么清晰。如果说给我们两种遍历的结果,让我们反推这棵树,那结果是唯一的。但直接给我们一个数组,让我们创建一棵二叉树,那创建的方式太多了,一时还真没啥思路。不过翻看了一本书,书中给了一种创建过程,他采用的原则是“小于父节点的值放在左子树,大于父节点的值放在右子树”。但是,让我困惑的是,他说“建立二叉树必须遵守这个原则”,我怎么从来没听说过这个原则???这个先不管了,不过这是创建二叉树的一种方式,总算有个可以依据的原则,接下来就创建吧。
三种遍历方式(递归&非递归)
直接上代码吧,注释还比较详细。
|
|