二叉树的遍历算法
递归遍历算法
把要调用函数自身的部分当成是已经完成的,再去按正常的思想去思考。
先根遍历算法
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)).
)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。