一:
1.将左结点入栈,直至左结点为空
2.判断右结点
(1)若右结点不为空且右结点未被访问过,则将右结点按照和左结点相同的规则入栈
(2)若右结点为空或已被访问过,则将当前结点输出,出栈并进行标记
**从分支再次进入循环,若从(1)进入,则继续入栈;若从(2)进入,则跳过入栈阶段,将当前栈顶置为当前结点
void IteratorPrint(TreeNode *root){
TreeNode *p,*pre; //pre标记被访问过的右结点
TreeNode *stack[N];
int top;
top=-1;
p=root;
while(1){
for(;p;p=p->left)
stack[++top]=p;
if(top>-1){
p=stack[top];
if(p->right&&p->right!=pre) //如果当前结点有右儿子并且未被访问过 ,下次循环将右儿子入栈
p=p->right;
else{
printf("%d\t",p->data);//如果当前结点没有右儿子或者右儿子已被访问过,则输出
pre=p; //标记
p=NULL; // 下次循环直接跳过入栈阶段,令当前节点为它的父结点
top--; //出栈
}
}
else
break;
}
}
二:
利用两个栈
1.第一个栈按照根入,左入,右入的顺序入栈
2.第一个栈按照根出,右出,左出的顺序出栈,即第二个栈按照根入,右入,左入的顺序入栈
void Iter_Print(TreeNode *root){
TreeNode *stack1[N];
TreeNode *stack2[N];
TreeNode *p;
int top1,top2;
top1=top2=-1;
stack1[++top1]=root;
while(top1>-1){
p=stack1[top1--];
stack2[++top2]=p;
if(p->left)
stack1[++top1]=p->left;
if(p->right)
stack1[++top1]=p->right;
}
while(top2>-1){
p=stack2[top2--];
printf("%d\t",p->data);
}
}