非递归实现二叉树先序、中序、后序遍历(栈实现)

本文详细介绍了如何使用栈非递归地实现二叉树的先序、中序和后序遍历。在先序遍历中,访问结点后再压栈;中序遍历则需要在遍历完左子树后访问根节点;后序遍历需保持根结点直到左右子树都访问过,同时为了避免死循环,需要记录上次访问的结点。

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

 

本篇文章主要详解利用栈的方式二叉树先序、中序、后序遍历的非递归写法

首先我们需要实现一颗二叉树。

以下是通过先序序列建树的代码

例如:先序序列{1,2,4,10,'#','#',6,11,'#','#',7'#','#','#',3,8,'#','#',9}代表以下的树

 
  1. typedef struct Node

  2. {

  3. int _data;

  4. Node* _right;

  5. Node* _left;

  6. Node()

  7. {}

  8. Node(int x)

  9. {

  10. _data = x;

  11. _left = NULL;

  12. _right = NULL;

  13. }

  14. }*pNode;

  15.  
 
//参数类型arr 数组指针,index 下标,size 数组元素个数,invalid代表先序遍历时遇到的NULL

pNode createTree_PrevOrder( const int* arr, size_t& index,const size_t size,int invalid){Node* root = NULL;if (index < size && arr[index] != invalid){root = new Node(arr[index]);root->_left = createTree_PrevOrder(arr, ++index, size, invalid);root->_right = createTree_PrevOrder(arr, ++index, size, invalid);}return root;}

先序非递归:

先序遍历时,每当我们压入一个结点,我们压入结点前对其进行访问。

 
  1. void prevOrder_NR(pNode root)

  2. {

  3. if (NULL == root)

  4. cout <

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值