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;
}
树三种遍历方式循环
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 二叉树(binary tree)是一颗树,其中每个节点都不能有多于两个的儿子。 1.二叉树节点 作为图的特殊形式,...