二叉树层序遍历递归与非递归_Python实现二叉树的非递归遍历

定义二叉树结构如下

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 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值