二叉树的非递归遍历
前言
以下是本博主用c语言创建栈和队列的博文
在二叉树遍历的时候,默认是先左子树后右子树。先,中,后是针对什么时候读取根节点而言的。
先序与中序的非递归过程可以通过这个图片来理解。 后序的非递归过程可以通过这个图片来理解。先序,中序与后序都需要借助栈来实现。对于c没有栈,所以本博主在代码中的栈是自己用c语言写的栈(链式栈),你们也可以依照自己的来改。在c++中就可以直接用STL中的了。
树的存储结构
//树的节点
typedef struct BiTNode {
char data;
struct BiTNode* left, * right;
}BiTNode,*BiTree;
先序遍历
先序的递归遍历
/* 先序遍历*/
//递归算法
void PreOrder(BiTree T) {
if (T) {
printf("%c ", T->data);
PreOrder(T->left);
PreOrder(T->right);
}
}
先序的非递归遍历
算法思路
- 先将根节点压入栈中,用一个工作指针node(初始值为根节点)
- 步骤1 遍历当前节点node的左子树,直到左子树为空。(在这里输出)
- 步骤2 弹出栈顶的空指针
- 步骤3 如果栈没有空,将栈顶元素弹出赋值给node,将node->right压入栈
代码:
void PreOrder_S(BiTree T) {
if (!T) return;
LinkStack S = (SNode*)malloc(sizeof(SNode));
init(S);//初始化链式栈,使其置为空
Push_L(S, T); //将根节点压入
BiTNode* node = Top_L(S);
while (!empty(S)) {
// 一直往左子树方向走,直到遇到空的节点
while (node) {
printf("%c ", node->data);
node = node->left; //置当前节点为其左子树
Push_L(S, node