定义二叉树结构如下
class
符号缩写
P:Parent 根节点
L:Left Node 左子树
R:Right Node 右子树
一、前序遍历(PLR)
从最容易想到的前序遍历开始,根节点入栈,每次出栈一个元素,并按右子树、左子树顺序入栈(则出栈顺序为左子树、右子树)
def
现在,我们用另一种思路实现非递归的前序遍历,将指针沿着左子树循环入栈,并记录节点值,完成PL步骤,当节点为空时,从栈顶取节点并将指针移到右子树,完成R步骤。
def
二、中序遍历(LPR)
考虑前序遍历的V2版本,我们发现,将记录结果的位置稍加修改,将记录结果(P步骤)的位置放在指针移动到右子树完成R步骤前,则完成了中序遍历。
def
三、后序遍历(LRP)
沿着指针移动的思路,我们先提出第一种后序遍历的方式,易发现后序遍历为PRL(前序遍历,但是先访问右子树)的逆序,因此,可以先按PRL的顺序进行前序遍历,再逆序输出结果
def
继续思考,我们发现,在后序遍历中,对于某个节点而言,只要记录了上一个访问的节点,若左子树存在且上一个访问节点既不是其左子树也不是右子树,则可知左子树需入栈待访问(L步骤);否则,若右子树存在,且上一个访问节点不是右子树,则可知右子树需入栈待访问(R步骤);否则,该节点出栈,并记录结果(P步骤)。
def