详细易懂的二叉树遍历(先中后)
首先说明,这只是我个人的一些理解与体会,我写下来是想让自己能随时随地复习与思考,并不是说想去教人家,所以其中可能会有些我个人理解不对的地方,这也正是我写博客的原因,这样才能不断进步,当然如果对读者有用的话,一起共勉。
今天我想记的是二叉树的遍历(先中后三种)。
我们都知道二叉树的遍历有四种,分别是先序遍历(也叫前序遍历),中序遍历,后序遍历以及层序遍历,在这里我不讲层序遍历(层序遍历是分别都从从每一层的左边向右边遍历)。以下的图是我自己画的,将就点看就行。
我们都知道二叉树分为根节点,左孩子,右孩子三部分,所以所谓先序中序后序遍历,其实也就是访问根节点的顺序,首先,先序遍历,即为访问根节点->访问左孩子->访问右孩子。 其次,中序遍历,即为访问左孩子->访问根节点->访问右孩子。最后,以此类推,后序遍历就是访问右孩子->访问左孩子->访问根节点。
然后有一点,这样不断的访问,缩小范围,实质上也是一个递归的过程,一个表面上的递归过程。在我的理解中,递归,就是不断不断的缩小同种类型的范围,当到达某个点后,就开始不断往回走,这在二叉树的遍历中就能表现出来,本身二叉树遍历的代码就是一个递归的过程。
先序遍历:访问根节点->访问左孩子->访问右孩子。
如上图,我们按照顺序来,先访问根节点,毫无疑问,先是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。
所以三种遍历方式就是这样,因为我画的树比较小,所以递归的效果不是很明显的看出来,大家可以试着画棵大点的树,不断缩小缩小,然后又层层返回,就能形象的理解递归了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库