算法题解与总结(一)

本文详细介绍了二叉树的四种遍历方法:先序、中序、后序及层次遍历。每种方法均提供了非递归实现思路,利用栈或队列辅助完成遍历过程,帮助读者深入理解二叉树数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指offer

二叉树的遍历

先序遍历(非递归版使用栈来实现):1、申请一个栈,将头结点压入栈中 cur = head;2、从栈中弹出栈顶元素cur并打印,再将cur的右子节点(不为空的话)压入栈中,最后将cur的左孩子节点(不为空的话)压入栈中;3、重复2步骤,直到stack为空。

中序遍历(非递归版使用栈来实现):1、申请一个栈,将头结点压入栈中,cur = head;2、依次将左边界压入栈中cur = cur.left;3、重复2,直到cur为空,从stack中弹出一个元素,记为node,并打印;且cur = node.right,重复过程2;4、stack为空且cur为空时,这个过程停止。

后序遍历:(方法一用两个栈实现,先序遍历的逻辑;方法二用一个栈实现,记录稍复杂)

方法一:用两个栈实现,一个栈stack1实现类似先序遍历(进头结点,弹出;依次进左、右,弹出;),只不过弹出时不打印,弹出到stack2中,最后从stack2中依次弹出并打印。

方法二:1、申请一个栈,将头结点压入栈中;设置两个变量cur和had,cur表示当前栈顶元素,had表示前一个弹出栈顶的元素;

2、每次令cur为当前栈顶的节点;分为以下三种情况处理:i)cur的左孩子不为空,且had不是cur的左孩子,也不是cur的右孩子,则将cur的左孩子压入栈中;ii)如果i情况不成立,且cur的右孩子不为空,且had不是cur的右孩子,则将cur的右孩子压入栈中;iii)如果i和ii条件均不成立,说明cur的左孩子和右孩子均已打印完毕,则从stack中弹出cur并打印,然后令had = cur;

3、一直重复步骤2在,直到stack为空。

层次遍历(宽度优先遍历,使用一个队列来实现):1、申请一个队列,头结点进队列 cur = head;2、cur出队列,并打印;将cur的左子树和右子树依次进队列(不为空的情况下)3、重复步骤2直到队列为空。

深度优先遍历(就是上面的前序、中序、后序遍历):使用栈来实现

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值