栈方式实现二叉树的遍历

递归方式就是函数自身调用自身,当递归每次调用自身时,可以看作是入栈的过程,当递归条件满足后,结束时递归再一级一级的返回,返回过程可以看作是出栈的过程。递归和栈的实现过程可以看出都是符合“先进后出,后入先出”的原则,所以递归方式其实可以转化为栈的方式来实现。

对于二叉树的遍历,先序、中序、后序遍历都可以用到递归方法实现,既然递归可以转化为栈,那么如何把对二叉树的遍历也改为用栈的思想来实现?

对于下面这个例子,我们用栈思想做中序遍历时,过程是这样的:一开始进入,遇到A结点,因为中序遍历的顺序,要把A结点的左子树都遍历完后,才把A输出。所以遇到A后,就把A结点入栈,接下来往左走,遇到子树B,同样看B的左子树,B结点的左子树存在,所以还不可以输出B,就把B入栈。再往左边走,遇到DD也先放入栈里面,接着看D的左子树,不存在,这时候就要返回了。把D输出,也就是出栈操作,把D Pop

### 使用实现二叉树的前序、中序和后序遍历 #### 前序遍历 (Pre-order Traversal) 前序遍历遵循 **根 -> 左子树 -> 右子树** 的顺序。使用可以模拟递归调用的过程。 以下是基于的前序遍历算法: ```python def preorder_traversal(root): if not root: return [] stack, result = [root], [] while stack: node = stack.pop() result.append(node.val) # 访问当前节点 if node.right: # 先压入右孩子(因为是后进先出) stack.append(node.right) if node.left: # 再压入左孩子 stack.append(node.left) return result ``` 上述方法利用的特点,确保每次弹出的是最近未处理过的节点,并优先访问其左子树[^1]。 --- #### 中序遍历 (In-order Traversal) 中序遍历遵循 **左子树 -> 根 -> 右子树** 的顺序。对于每个节点,需先到达其最左侧叶子节点再回溯。 以下是基于的中序遍历算法: ```python def inorder_traversal(root): if not root: return [] stack, result = [], [] current = root while stack or current: while current: # 将左子树路径上的所有节点压入 stack.append(current) current = current.left current = stack.pop() # 弹出并访问当前节点 result.append(current.val) current = current.right # 转向右子树继续遍历 return result ``` 此方法通过不断深入到左子树并将沿途经过的节点存入,在返回过程中逐步访问这些节点及其右子树[^2]。 --- #### 后序遍历 (Post-order Traversal) 后序遍历遵循 **左子树 -> 右子树 -> 根** 的顺序。由于最后才访问根节点,因此需要额外标记已访问过的孩子节点或者借助两个完成。 以下是单版本的后序遍历算法: ```python def postorder_traversal(root): if not root: return [] stack, result = [root], [] while stack: node = stack.pop() result.append(node.val) # 先暂存根节点的结果 if node.left: # 左孩子先进 stack.append(node.left) if node.right: # 右孩子随后进 stack.append(node.right) return result[::-1] # 最终反转结果列表得到正确的后序序列 ``` 这种方法的核心在于逆序构建最终结果集并通过翻转恢复正常的后序排列[^3]。 --- ### 总结 三种遍历方式均可以通过来替代递归来实现,其中的关键是对节点的操作时机以及如何控制进出顺序。前序遍历相对直观;中序遍历时需要注意持续探索左子树直至尽头后再逐级回退;而后序遍历则因延迟访问根节点而引入了一些特殊技巧。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值