先序遍历(非递归)
void Preorder(BTNode *root){
stack<BTNode *> sta;
sta.push(root);
while(!sta.empty()){
BTNode *p=sta.top();
sta.pop();//出栈,并输出data
cout<<p->data<<" ";
if(p->right)//先把右节点压入栈
sta.push(p->right);
if(p->left)//再把左节点压入栈,因为先入后出
sta.push(p->left);
}
}
中序遍历(非递归)
void Inorder(BTNode *root){
stack<BTNode *> sta;
BTNode *p=root;
while(p||!sta.empty()){
if(p){//先把结点的一连串左子树压入栈中
sta.push(p);
p=p->left;
}
else//说明不能往左跑,那咱就先输出该节点data,再判断可不可以往右跑
{
p=sta.top();
cout<<p->data<<" ";
sta.pop();
if(p->right)//可以往右跑
p=p->right;
else
p=NULL;//防止往左跑
}
}
}
后序遍历(非递归)
void Postorder(BTNode *root){
stack<BTNode *> sta;
BTNode *p=root,*r; //r为标记指针
while(p||!sta.empty()){
if(p){
sta.push(p);
p=p->left;
}
else//往左跑不动开始往右跑
{
p=sta.top();
if(p->right&&p->right!=r)//判断是否可以往右节点跑
p=p->right;
else
{
sta.pop();//不可以往右节点跑,咱就直接输出该data并且出栈(该节点已没有用)
r=p;//标记一下刚输出的节点
cout<<p->data<<" ";
p=NULL;//防止往左跑
}
}
}
}