//非递归算法实现的基本思路:使用堆栈
/*中序遍历非递归遍历算法
1>当遇到一个节点,就把他压栈,并遍历他的左子树
2>当左子树遍历结束后,从栈顶弹出这个节点并访问他
3>然后按其右指针再去中序遍历该节点的右子树
*/
//一个节点必定会被访问三次。先序是当第一次访问节点时打印,中序是当第二次访问节点时打印。
struct btree
{
struct btree *left;
struct btree *right;
int val;
};
//code:中序
void InOrderTraversal(struct btree *t)
{
Stack S = CreatStack(Maxsize);//创建并初始化堆栈
while( t || !Isempty(S))//树存在or栈非空
{
while(t)//当t->left为空终止
{
Push(S,t);//①:第一次访问节点,一直向左并将沿途节点压入堆栈
t = t->left;
}
if(!Isempty(S))
{
t = pop(S);//②:第二次访问节点,节点弹出堆栈
printf("%5d\n",t->val);//打印节点
t = t->right;
}
}
}
//code:先序
void PreOrderTraversal(struct btree *t)
{
Stack S = CreatStack(Maxsize);//创建并初始化堆栈
while( t || !Isempty(S))//树存在or栈非空
{
while(t)//当t->left为空终止
{
Push(S,t);//①:第一次访问节点,一直向左并将沿途节点压入堆栈
printf("%5d\n",t->val);
t = t->left;
}
printf("%s\n", );
if(!Isempty(S))
{
t = pop(S);//②:第二次访问节点,节点弹出堆栈
t = t->right;
}
}
}