前言:
阅读本文时,你只需要了解到二叉树的基本遍历思想。
借助栈就可以将二叉树的递归遍历算法转化成非递归遍历算法。
我们知道,二叉树一般使用的是链式存储,栈可以使用顺序存储也可以使用链式存储。
所以一般情况下,使用栈实现二叉树的非递归遍历算法有两种存储方式:
- 链式存储树-顺序存储栈
- 链式存储树-链式存储栈
本文中使用到的是链式存储树-链式存储栈。对于第一种存储方式,读者可以自行尝试,其实大同小异,这里不再赘述。
直接开始重点,具体实现思想如下:
回顾二叉树先序遍历的步骤:
- 访问根结点;
- 先序遍历左子树;
- 先序遍历右子树;
那么算法的核心部分我们就可以这样设计:
- 定义一个树结构体指针p,初始化指向树的根结点;
- 访问p所指向的结点地址的值,然后将p压入栈;
- 访问p所指向结点的左孩子,并且访问p所指向的结点地址的值,将p压入栈;
- 这个过程直到p指向为空;
- 此时取出栈顶元素,将p指向栈顶元素的右孩子;
- 上述循环的跳出条件是栈空;
代码实现:
1.树结构的定义与栈结构的定义:
//树结点结构定义
typedef struct BiTNode {
int data;
struct BiTNode* lchild, * rchild;
}*BiTree;
//链栈结点结构定义
typedef struct Linknode {
BiTNode* data;
struct Linknode* next;
}*Stack;
2.手动创建一个二叉树: