首先说明,这只是我个人的一些理解与体会,我写下来是想让自己能随时随地复习与思考,并不是说想去教人家,所以其中可能会有些我个人理解不对的地方,这也正是我写博客的原因,这样才能不断进步,当然如果对读者有用的话,一起共勉。
今天我想记的是二叉树的遍历(先中后三种)。
我们都知道二叉树的遍历有四种,分别是先序遍历(也叫前序遍历),中序遍历,后序遍历以及层序遍历,在这里我不讲层序遍历(层序遍历是分别都从从每一层的左边向右边遍历)。以下的图是我自己画的,将就点看就行。
我们都知道二叉树分为根节点,左孩子,右孩子三部分,所以所谓先序中序后序遍历,其实也就是访问根节点的顺序,首先,先序遍历,即为访问根节点->访问左孩子->访问右孩子。 其次,中序遍历,即为访问左孩子->访问根节点->访问右孩子。最后,以此类推,后序遍历就是访问右孩子->访问左孩子->访问根节点。
然后有一点,这样不断的访问,缩小范围,实质上也是一个递归的过程,一个表面上的递归过程。在我的理解中,递归,就是不断不断的缩小同种类型的范围,当到达某个点后,就开始不断往回走,这在二叉树的遍历中就能表现出来,本身二叉树遍历的代码就是一个递归的过程。
先序遍历:访问根节点->访问左孩子->访问右孩子。
如上图,我们按照顺序来,先访问根节点,毫无疑问,先是A,然后访问A的左孩子,然后,递归的形象化就出来了。因为A的左孩子又是一颗二叉树,如上面所说,缩小范围,所以,BCD就是一颗“新”二叉树,我们继续访问根节点,为B,然后访问左孩子,B的左孩子是C,其实,C也是一颗树,只不过它是一颗左右孩子都为空的树,继续访问根节点,为C。你看,对于BCD这棵树(以下二叉树我都简称为树)而言,根->B,左孩子->C,右孩子->D,所以它就访问结束了。然而,当BCD树访问完了,对于整个树来说,即A的左孩子,也访问完了,所以又像上面说的“往回走”。所以接下来轮到访问A的右孩子,对于E,为“新树EF”的根节点,访问,为E,E的左孩子为空,然后到右孩子,为F,F的左右都为空,至此,A的右孩子访问结束,所以,对于此树,先序遍历的结果为ABCDEF 。
中序遍历:访问左孩子->访问根节点->访问右孩子。
中序遍历也是如此的道理,先是访问左孩子,左孩子还有左孩子,递归下去,访问,为C,然后到根节点,为B,再到右孩子,为D,然后,对于整棵树而言,左孩子访问结束,轮到根节点,为A,然后,右孩子,对于“EF树”来说,左孩子为空,根节点为E,右孩子为F,所以分别是为E,为F,至此,整棵树的右孩子也访问结束。所以,对于此树,中序遍历的结果为CBDAEF。
后序遍历:访问左孩子->访问右孩子 ->访问根节点。
相信经过前两个的说明,大家也能掌握后序遍历的情况了,我们直接来,左孩子,“BCD”,继续左孩子,为C,右孩子,为D,根节点,为B,再到整棵树的右孩子“EF”,左孩子,为空,右孩子,为F,根节点,为E,左右结束,根节点,为A。对于此树,中序遍历的结果为CDBFEA。
所以三种遍历方式就是这样,因为我画的树比较小,所以递归的效果不是很明显的看出来,大家可以试着画棵大点的树,不断缩小缩小,然后又层层返回,就能形象的理解递归了。