1.将根节点压入栈中
2.进入循环:只要栈中元素个数大于0,进行循环操作
2.1弹出栈顶元素
2.2如果这个栈顶元素标记为真,输出这个元素并且执行下次循环
2.3如果栈顶元素为假,将节点的标志设为真
2.4将该节点的右子树、左子树、根压入栈中
2.5执行下一次循环
SeqStack.h
tset.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct BinaryNode
include"SeqStcack.h"
{
char ch;
struct BinaryNode*lChild //左子树节点
struct BinaryNode*rChild//右子树节点
int flag;
};
/*
1.将根节点压入栈中
2.只要栈size>0 执行循环
2.1拿出栈顶元素
2.2如果栈顶元素的标志为 真 直接输出 执行下一次循环
2.3如果不是真 该flag的标志改为真
2.4将右节点和左节点 和根入栈
2.5执行下一次循环
*/
void nonReursion(struct BinaryNode root)
{
//初始化栈
seqStack myStack=init_SeqStack();
//1.将根节点压入栈中
push_SeqStack(myStack,root);
//2.只要栈size>0 执行循环
while(size_SeqStack(myStack)>0);
{
//2.1获取栈顶元素
struct BinaryNode*topNode=top_SeqStack(myStack);
//弹出栈顶元素
pop_SeqStack(myStack);
// 2.2如果栈顶元素的标志为 真 直接输出 执行下一次循环
if(topNode->flag==1)
{
printf("%c\n",topNode->ch);
contunue;
}
//2.3如果不是真 该flag的标志改为真
tioNode->flag=1;
//将右节点和左节点 和根入栈
if(topNode->rChild!=NULL)
{
push_SeqStack(myStack,topNode->rChild);
}
if(topNode->lChild != NULL)
{
push_SeqStack(myStack,topNode->lChild);
}
push_SeqStack(myStack,topNode)
}
fre(myStack);
myStack==NULL;
}
void tset()
{
struct BinaryNode nodeA={'A',NULL,NULL};
struct BinaryNode nodeB={'B',NULL,NULL};
struct BinaryNode nodeC={'C',NULL,NULL};
struct BinaryNode nodeD={'D',NULL,NULL};
struct BinaryNode nodeE={'E',NULL,NULL};
struct BinaryNode nodeF={'F',NULL,NULL};
struct BinaryNode nodeG={'G',NULL,NULL};
struct BinaryNode nodeH={'H',NULL,NULL};
}
//建立节点关系
nodeA.lChild=&nodeB;
nodeA.rChild=&nodeF;
nodeB.rChild=&nodeC;
nodeC.rChild=&nodeE;
nodeC.lChild=&nodeD;
nodeF.rChild=&nodeG;
nodeG.lChild=&nodeH;
//执行非递归遍历
nonReursion(&nodeA);
}
int main()
{
system("puase");
return EXIT_SUCCESS;
}
SeqStack.c