美文网首页
树2,用递归实现树的三种遍历

树2,用递归实现树的三种遍历

作者: 小碧小琳 | 来源:发表于2018-07-12 22:35 被阅读0次

面试时提到的树,大部分是二叉树。每个结点最多只能有两个子结点。
在二叉树中,最重要的操作就是遍历,即按照某一顺序访问树中的所有结点。通常树有如下几种遍历方式:

前序遍历就是根节点在前面,中序遍历就是根节点在中间,后序遍历就是根节点在后面。

要很好地理解上面三种遍历方式,一定要深刻的理解这句话:我们能够把一个二叉树的任何子节点当成二叉树本身,一个子节点不单单只是一个节点,这是一个二叉树类实例,我们对一个节点进行操作,就是在对一个树进行操作。

理解这句话以后,就容易理解三种遍历是如何进行的了。
前序遍历访问一个节点,就是对这个节点为根的树,进行前序遍历。

如图2.5

一、三种遍历方法

1.1、前序遍历:

先访问根节点,再访问左子节点,最后访问右子节点
步骤1:
先访问以10为根节点的树,此时先访问根节点,于是会输出10。

步骤2:
再访问“大树”的左子节点6,一个节点就是一个树,访问左子节点6,就相当于用前序遍历访问左子树。于是对于左子树,先访问根节点6,于是会输出6。

步骤3:再访问左子树的左子节点4,此时是对以4为根节点的树,进行前序遍历。先访问根节点4,于是输出4。

步骤4:最左边的以4为根节点的树没有左右子节点,于是此树的前序遍历完毕。于是返回上一个树的前序遍历过程。上一个前序遍历已经访问了根节点6,左子节点4,于是接着访问右子节点8。而8是左子树的右子树,对这个树的根节点进行访问,于是会输出8。

步骤5:访问根节点8以后,发现没有左右子节点,于是返回上一个左子树的前序遍历,发现已经遍历完了 。于是再返回上一级“大树”的前序遍历。发现大树的前序遍历过程,该访问右子节点了。于是对右子节点14进行访问,也就相当于对右子树进行前序遍历访问,于是会先输出根节点14

步骤6:步骤就是再访问别的子节点,然后对子节点为根的树进行前序遍历。一直遍历完这个树。

到这里,我们会发现,对一个节点进行访问,那就是对以该节点为根节点的树进行访问,到底以后逐级返回就行。

1.2、中序遍历:

先访问左子节点,再访问根节点,再访问右子节点。
根节点在中间
步骤1:对大树进行访问,先访问左子节点6。
每个节点都是一个树.
对以6为根节点的左子树进行访问,先访问左子树的左子节点4.
对以4为根的树进行访问,发现左节点为空,访问完毕,于是再访问根节点4,输出4,再访问右子节点,发现为空。此时对以4为根的树访问完毕,返回上一级。
步骤2:此时左子树的左子节点4已经访问完毕,于是访问左子树的根节点,于是输出6.
...
步骤i:返回大树的根节点10以后,此时会对大树的右子节点14进行中序遍历访问。就是对右子树进行中序遍历访问。于是会先对右子树的左子节点12进行访问,访问完毕输出12以后,才会访问右子树的根节点14.
...

按照这个思想,中序遍历,从以10为根节点的树不断地访问下面的树,最终会返回
4,6,8,10,12,14,16

1.3、后序遍历:

先访问左子节点,再访问右子节点,最后 再访问根节点。
根节点在后面
按照上述逻辑,不断地递归访问,把每一个节点当成一个树,进行访问,然后再逐级返回。最终的输出结果就是4/8/6/12/16/14/10.

因为这 三种遍历都有递归和循环两种不同的实现方法。应该对这三种遍历的六种实现方法都了如指掌。

二、用代码实现这三种遍历

2.1、递归实现:

2.1.1、前序遍历

先用递归,递归比较简单:

  • 1、函数结束条件:传入的节点参数为空。
  • 2、按照前序遍历的顺序(对于传入的node,先访问以node为根节点的树的根节点,再访问此树的左子节点,再访问此树的右子节点)。
    于是应该先返回根节点
    然后把左子节点(即左子树)作为参数,传入函数中,让函数访问以左子节点为根节点的树。
    同样的把右子节点作为参数,传入函数中。
    代码实现:
def preorder(tree):
    if tree:
        print(tree.getRootVal())
        preorder(tree.getLeftChild())
        preorder(tree.getRightChild())

2.1.2、中序遍历

先访问左子节点==>先把左子节点(左子树)作为参数传入函数中
再访问根节点 ==> 返回根节点的值
再访问右子节点==>再把右子节点(右子树)作为参数传入函数中

代码实现:

def inorder(tree):
  if tree != None:
      inorder(tree.getLeftChild())
      print(tree.getRootVal())
      inorder(tree.getRightChild())

2.1.2、后序遍历

先访问左子节点==>先把左子节点(左子树)作为参数传入函数中
再访问右子节点==>再把右子节点(右子树)作为参数传入函数中
再访问根节点 ==> 返回根节点的值

代码实现:

def postorder(tree):
    if tree != None:
        postorder(tree.getLeftChild())
        postorder(tree.getRightChild())
        print(tree.getRootVal())

相关文章

  • 数据结构学习_01二叉树的三种遍历方式

    1、二叉树遍历主要三种遍历 : 2、三种遍历方式的流程 :   先序遍历 : 3、代码实现三种遍历方式(递归) :...

  • 二叉树三种遍历的递归和非递归实现&层次遍历实现(C++)

    对于二叉树的三种遍历方式(先序、中序、后序),用递归和非递归(栈)的方式实现,对于后序遍历用队列实现。 四种遍历方...

  • 用循环遍历树

    树的遍历用递归法最为简便,那么用循环该如何实现呢? 用循环方法后序遍历树。递归的本质是用了栈结构,不能用递归就自己...

  • 二叉树的三种深度优先遍历算法与思路

    看了一些关于二叉树遍历算法的文章,例如:二叉树三种遍历方式的递归和循环实现二叉树的递归与非递归遍历(前序、中序、后...

  • 树2,用递归实现树的三种遍历

    面试时提到的树,大部分是二叉树。每个结点最多只能有两个子结点。在二叉树中,最重要的操作就是遍历,即按照某一顺序访问...

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 总结

    1、二叉树广度遍历(非递归) 广度遍历非递归实现需要依靠一个队列。 2、二叉树深度遍历(递归与非递归,前序,中序和...

  • 树的遍历算法

    树的递归遍历 树的层次遍历 树的非递归前序遍历 树的非递归中序遍历

  • 力扣 94 二叉树的中序遍历

    题意:中序遍历树 思路:用stack实现树的中序遍历非递归,具体见代码 思想:树的中序遍历 复杂度:时间O(n),...

  • 数据结构之二叉树

    数据结构之二叉树 递归构造二叉树 二叉树节点: 递归构造: 图示: 递归遍历 递归实现先序遍历 图示: 递归实现中...

网友评论

      本文标题:树2,用递归实现树的三种遍历

      本文链接:https://www.haomeiwen.com/subject/ddxdpftx.html