正如我的ID所述,作为一名文科生,学习代码对我个人而言是痛苦至极的。恰逢老师刚才上课讲到二叉树的遍历,思索良久后,有了一些理解,于是想着赶快记录一番,留下自己小小的成就感。目前还不会写代码,这篇博客只是试着表述一下遍历的思想,代码后续会补上。
先序遍历的顺序如下:根结点——>左子树——>右子树。中序遍历顺序如下:左子树——>根结点——>右子树。 后序遍历的顺序如下:左子树——>根结点——>右子树。 所谓先、中、后指的是根结点是第几个遍历到的,第一个遍历即是先,第二个遍历即是中,第三个遍历自然就是后了。至于先左后右,就是人们的习惯了吧
一、总体的思想
1.“一条路走到黑” 即一直执行一个顺序,直到这个顺序中最下面的那个被找到或者找不到 ,才执行下一个顺序的操作。
2.每一个当一个树的左子树/根结点被遍历完了以后,才能遍历改层级树的右子树和根结点/左子树,即是每一个层级的树,如果向想执行下一步的遍历,必须把这一步的遍历全部执行完(子树上所有的元素都要被遍历到)。
二、以后序遍历为例
见上图,用后序遍历来对上图中的二叉树进行遍历。首先明确顺序:左子树,右子树、根结点。如下图是大概的遍历过程:
按照后序遍历的要求,先遍历左子树,即是找到以B为根结点的子树,此时不要管右子树和根结点。继续将以B为根结点的子树中找左子树,发现左子树没有(进行下一个顺序),因此按照顺序,下一个找以B为根结点的子树右子树,即是以C为根结点的子树;继续根据顺序,在以C为根结点的子树中找左子树,找到D,同时发现D没有子树了,所以选择遍历D(“一条路走到黑”)。而后找右子树(此时的视角是以C为根结点的子树),没有找到,所以按照顺序的下一个,找根结点,遍历C。现在把视角换到以B为根结点的子树,发现以B为根结点的子树的左子树和右子树都找完了,该找根结点了,于是遍历到B。总的树的左子树找完了,按照后序的顺序,该找右子树了,即是以E为根结点的子树。同样的,在以E为根结点的子树中先找左子树,没有找到,那么就换顺序,找右子树;找到以F为根结点的子树,在这个子树中找左子树——以G为根结点的子树,再继续找左子树,找到叶结点H,进行下一个顺序,找右子树,找到叶结点K,进行下一个顺序,找到根结点G。此时,以F为根结点的子树的左子树被找完了,找右子树没找到,于是遍历根结点F。再看以E为根结点的子树,其左子树和右子树都被找完了,于是找到根结点E。此时我们终于皆大欢喜地发现,树的左右子树均被遍历完了,我们现在终于可以把根结点A最终遍历到了!
用递归的思想来看:大问题划分为结构相似的小问题(在每一个层级中均要执行遍历的顺序),而且有退出条件——找不到或者找到叶结点。而且每一层方法中都嵌套着自身。