对于计算机语言学习了这么久,越是深入学习,越是发现无法理解的东西越多。
其实在很多时候,我们都忽视了复杂事物是由简单原理组成的这一基本思想。但也正式因为这种思想,将复杂的事物细分为简单的组成反而编程了一件十分繁琐的事情。
对于计算机中的“树”,很多人第一次正式意义上的认识树,可能是在学习完数据结构与算法树的一掌之后才建立了对于树的认识。即便是认识了树,对于树的运用也是二晕二晕的。
树是一种很常见的计算机结构。当然,这是一句废话。很多人多为计算机程序的初学者,不论是选择了面向对象的编程语言还是选择了面向过程的编程语言抑或是选择了面向切面的编程语言。终究还是逃不过回归到基本的数据结构上去。
在浏览网页的时候,HTML的dome就是一棵完整的树。在程序的编译过程中,程序会被语法分析器翻译成成语法树等等。
举一个栗子:
1+2*3,用计算机语言实现
在LISP语言中,用程序的实现如下( * ( + 1 2 ) 3 )
在FORTH语言中,用程序的实现如下 1 2 + 3 *
在FORTRAN语言中,用程序的实现如下 1 + 2 * 3
你会发现,除了FORTRAN语言写的语法,LISP与FORTH你可能完全不懂这是啥意思。在详细解释上面的例子之前,我会先讲讲波兰表示法与逆波兰表示法。前缀表达式与后缀表达式被称波兰表示法,因为最先研究这个是一个名叫:JanLukasiewicz的波兰人,尽管如此,但这却不能说明波霸奶茶是一个波霸妹子发明的。中缀表达式称为逆波兰表示法。
那么问题来了,什么是前缀表达式,后缀表达式和中缀表达式呢?答案显而易见,运算符在运算对象之前,叫前缀表达式;在运算对象之后,叫后缀表达式;在运算对象中间叫中缀表达式。
所以LISP语言的程序实现是用的前缀表达式,FORTH的实现是用的后缀表达式,FORTRAN的实现是用的中缀表达式,也就是我们常见语言的表达式方法。
很多人看到这里,或许会觉得我已经偏离了树的主题。我们不是在讲树么?这又是啥玩意啊,那么请看看下面的图:
无论你使用上述的哪一种语言去计算表达式,计算机都会建立一棵如上的语法树。
LISP语言中,使用前缀表达式,等于树的先序遍历;
FORTH语言中,使用后缀表达式,等于树的后续遍历;
FORTRAN语言中,使用中缀表达式,等于树的中序遍历,也就是大家最熟悉的遍历方法。
我们再看看流程控制语句:
if( ){ } else { }
在计算机的语法分析器里会建立一棵如下的树:

expr是条件,smt1是条件为真的执行,smt2是条件为假的执行。
所以,不论选择学习哪一门语言,在计算机最后的执行看来,都是没有什么差别的。
这也是为什么C++中对于vector的使用,会出现在vector<vector<int> >的> >中间加个空格的原因了。
所以,树对于计算机学习以及编程理解及错误分析上起着很重要的作用。