• 详细易懂的二叉树遍历(先中后)


    首先说明,这只是我个人的一些理解与体会,我写下来是想让自己能随时随地复习与思考,并不是说想去教人家,所以其中可能会有些我个人理解不对的地方,这也正是我写博客的原因,这样才能不断进步,当然如果对读者有用的话,一起共勉。

     

    今天我想记的是二叉树的遍历(先中后三种)。

    我们都知道二叉树的遍历有四种,分别是先序遍历(也叫前序遍历),中序遍历,后序遍历以及层序遍历,在这里我不讲层序遍历(层序遍历是分别都从从每一层的左边向右边遍历)。以下的图是我自己画的,将就点看就行。

    我们都知道二叉树分为根节点,左孩子,右孩子三部分,所以所谓先序中序后序遍历,其实也就是访问根节点的顺序,首先,先序遍历,即为访问根节点->访问左孩子->访问右孩子。 其次,中序遍历,即为访问左孩子->访问根节点->访问右孩子。最后,以此类推,后序遍历就是访问右孩子->访问左孩子->访问根节点

     

    然后有一点,这样不断的访问,缩小范围,实质上也是一个递归的过程,一个表面上的递归过程。在我的理解中,递归,就是不断不断的缩小同种类型的范围,当到达某个点后,就开始不断往回走,这在二叉树的遍历中就能表现出来,本身二叉树遍历的代码就是一个递归的过程。

     

    先序遍历:访问根节点->访问左孩子->访问右孩子。

    如上图,我们按照顺序来,先访问根节点,毫无疑问,先是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。

     

    所以三种遍历方式就是这样,因为我画的树比较小,所以递归的效果不是很明显的看出来,大家可以试着画棵大点的树,不断缩小缩小,然后又层层返回,就能形象的理解递归了。

     

     

  • 相关阅读:
    水平触发与边缘触发
    Leetcode935 骑士拨号器
    leetcodeF47 礼物的最大价值
    leetcodeF42 连续子数组的最大和
    leetcode12 矩阵中的路径 回溯算法
    leetcode14-II 剪绳子II DP 解法配合快速乘取模
    leetcode17.16 按摩师DP
    leetcode530 二叉树的最小绝对差
    PCB genesis大孔加小孔(即卸力孔)实现方法
    PCB genesis短槽加引导孔实现方法
  • 原文地址:https://www.cnblogs.com/yellowgg/p/6735293.html
Copyright © 2020-2023  润新知