1.中序遍历非递归
2.先序遍历非递归
3.后序遍历非递归
- 中序遍历非递归
//伪代码中序和先序非递归遍历
P=T;//T为根结点
stack<Typename> temp;//用栈来模拟递归过程
if(!P)
{
return null;//此时为空结点
}
temp.push(P);根结点入栈
while(!temp.empty())
{
//如果栈非空
P=P->Left;
if(P)//如果有左节点
{
temp.push(P);
}
else
{
P=temp.top()//P返回上层
temp.pop();//弹出P
P=P->right;//访问右结点
}
}
前序遍历非递归
struct BiNode
{
int data;
BiNode *left;
BiNode *right;
};
stack<BiNode>temp;
void creatpreorder(BiNode *T)
{
//
BiNode *p;
p = T;
if (p)//如果树为空
{
cout << "树为空";
return ;
}
temp.push(*p);
cout << p->data;
p = p->left;
while (!temp.empty())//如果栈不为空
{
if (p)
{
temp.push(*p);
cout << p->data;
p = p->left;
}
else
{
BiNode *pp;
*pp = temp.top();
temp.pop();
p = p->right;
}
}
}
中序遍历非递归
struct BiNode
{
int data;
BiNode *left;
BiNode *right;
};
stack<BiNode>temp;
void creatpreorder(BiNode *T)
{
//
BiNode *p;
p = T;
if (p)//如果树为空
{
cout << "树为空";
return ;
}
temp.push(*p);
cout << p->data;
p = p->left;
while (!temp.empty())//如果栈不为空
{
if (p)
{
temp.push(*p);
p = p->left;
}
else
{
BiNode *pp;
*pp = temp.top();
cout<<*pp;
temp.pop();
p = p->right;
}
}
}
后序遍历非递归
void postOrder(TreeNode *T){
TreeNode *stack[15];
int top = -1;
int flagStack[15]; //记录每个节点访问次数栈
TreeNode *p = T;
while(p!=NULL||top!=-1){
if(p!=NULL){ //第一次访问,flag置1,入栈
stack[++ top] = p;
flagStack[top] = 1;
p = p->lChild;
}else{//(p == NULL)
if(flagStack[top] == 1){ //第二次访问,flag置2,取栈顶元素但不出栈
p = stack[top];
flagStack[top] = 2;
p = p->rChild;
}else{ //第三次访问,出栈
p = stack[top --];
printf("%d\t",p->data); //出栈时,访问输出
p = NULL; //p置空,以便继续退栈
}
}
}
}