二叉树的遍历算法

递归遍历算法

把要调用函数自身的部分当成是已经完成的,再去按正常的思想去思考。

先根遍历算法

PreOrder(t)//t为二叉树的根节点

PreOrder1.[递归出口]

      IF t==NULL THEN RETURN。

PreOrder2.[访问根]

      PRINT(Data(t)).

PreOrder3.[递归]

      PreOrder(Left(t)).

      PreOrder(Right(t)).

_________________________________________________________________________

中根遍历算法

InOrder(t)//t为二叉树的根节点

InOrder1.[递归出口]

      IF t==NULL THEN RETURN。

InOrder2.[递归]

      InOrder(Left(t)).

InOrder3.[访问根]

      PRINT(Data(t)).

InOrder4.[递归]

      InOrder(Right(t)).

_________________________________________________________________________

后根遍历算法

PostOrder(t)//t为二叉树的根

PostOrder1.[递归出口]

       IF t==NULL THEN RETURN。

PostOrder2.[递归]

       PostOrder(Left(t)).

       PostOrder(Right(t)).

PostOrder3.[访问根]

       PRINT(Data(t)).

_________________________________________________________________________

非递归遍历算法

先根遍历算法

先访问根节点,然后将其压入栈中,接着访问左子结点,并入栈,一直到左子节点为空,弹栈访问右子结点,重复执行。

NPreO(t)

NPreO1.[初始化]

     CREATE(S). p=t. //操作CREATE(S)指创建一个空栈S。

NPreO2.[入栈]

     WHILE p!=NULL DO

     ( PRINT(Data(p). S<=p. p=Left(p). ) //S<=p 表示p入栈

NPreO3.[栈为空?]

     IF S为空 THEN RETURN。

     ElSE p<=S.//表示S弹出一个元素,并将其赋值给p。

NPreO4.[更新p]

     p=Right(p).

NPreO5.[返回]

     GOTO NPreO2.

_________________________________________________________________________

中根遍历算法

与先根遍历类似,只是在访问结点的次序上有所调整,要在更新p,即访问右子结点之前打印p的值。

NInO(t)

NInO1.[初始化]

    CREATE(S). p=t.

NInO2.[入栈]

    WHILE p!=NULL DO

    ( S<=p. p=Left(p). )

NInO3.[栈为空?]

    IF S为空 THEN RETURN。

    ELSE p<=S.

NInO4.[访问p,更新p]

    PRINT(Data(p)). p=Right(p).

NInO5.[返回]

    GOTO NInO2.

_________________________________________________________________________

后根遍历算法

在算法中,栈的元素为 (结点,标号i)i为0,1或2。树中的任意结点p都需要进栈3次,出栈3次。第一次出栈是为遍历结点p的左子树,第二次出栈是为遍历结点p的右子树,第三次出栈是访问结点p。

具体方法如下:

(1)将(根节点,0)压入栈中。

(2)弹栈,对出栈元素(p,i)中的标号i进行判断。

1>若i=0,则将(p,1)压入栈中;若结点p的左指针不为空,则将(Left(p),0)入栈,准备遍历其左子树。

2>若i=1,此时已经遍历完结点p的左子树,则将(p,2)压入栈中。若右指针不为空,则将(Right(p),0)入栈,准备遍历其右子树。

3>若i=2,此时已经遍历玩完点p的右子树,访问结点p。

NPostO(t)

NPostO1.[初始化]

     IF t==NULL THEN RETURN

     CREATE(S). S<=(t,0).

NPostO2.[后根遍历]

     WHILE S非空 DO

     ( (p,i)<=S.

      IF(i=0) THEN (S<=(p,1).IF Left(p)!=NULL THEN S<=(Left(p),0). ).

      IF(i=1) THEN (S<=(p,2).IF Right(p)!=NULL THEN S<=(Right(p),0). ).

      IF(i=2) THEN PRINT(Data(p)).

     )

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。