class BTnode
{
public:
BTnode(int a):value(a),left(NULL),right(NULL){};
int value;
BTnode* left;
BTnode* right;
};
/*
* 先序遍历 循环
*/
void Preorder(BTnode* root)
{
stack<BTnode*> stack;
if(root==NULL)return;
BTnode* cur=root;
while(cur!=NULL)
{
cout<<cur->value<<" ";
if(cur->left != NULL)
{
stack.push(cur);
cur=cur->left;
}
else if(cur->right != NULL)
{
cur=cur->right;
}
else
{
cur=NULL;
while(!stack.empty())
{
BTnode* tmp=stack.top();
if(tmp->right!=NULL)
{
cur=tmp->right;
stack.pop();
break;
}
stack.pop();
}
}
}
cout<<endl;
}
/*
* 中序遍历 循环
*/
void midorder( BTnode*const root)
{
if(root==NULL)return;
stack<BTnode*> stack;
BTnode* cur=root;
while(cur!=NULL)
{
if(cur->left!=NULL)
{
stack.push(cur);
cur=cur->left;
}
else
{
cout<< cur->value<<" ";
if(cur->right!=NULL)
{
cur=cur->right;
}
else
{
cur=NULL;
BTnode* tmp=NULL;
while(!stack.empty())
{
tmp=stack.top();
cout<<tmp->value<<" ";
if(tmp->right!=NULL)
{
cur=tmp->right;
stack.pop();
break;
}
stack.pop();
}
}
}
}
cout<<endl;
}
/*
* 后序遍历 循环
*/
void aftorder(BTnode* root)
{
if(root==NULL)return;
BTnode* cur=root;
stack<BTnode*> stack;
int flag=0;
while(cur!=NULL)
{
if(cur->left!=NULL)
{
stack.push(cur);
cur=cur->left;
}
else if(cur->right!=NULL)
{
stack.push(cur);
cur=cur->right;
}
else
{
cout<<cur->value<<" ";
BTnode* tmp;
BTnode* pre=cur;
cur=NULL;
while(!stack.empty())
{
tmp=stack.top(); //判断出栈时,当前的节点是top节点的左儿子还是右儿子,
if(tmp->right==pre||tmp->right==NULL) //从而判断当前top节点的左右儿子是否已经被访问.如果当前节点是左儿子,
{ //则说明右儿子还未被访问,如果是右儿子则说明两个儿子都被访问了,
cout<<tmp->value<<" "; //可以访问父节点了
pre=tmp;
stack.pop();
}
else if(tmp->left==pre)
{
cur=tmp->right;
break;
}
}
}
}
cout << endl;
}
网友评论