void Btree::FdginOrder(mytree t)//中序非递归遍历
{
if(t==NULL)
;
mytree p=t;
stack<mytree> s;
while(!s.empty()||p)
{
while(p)
{
s.push(p);
p=p->left ;
}
if(!s.empty())
{
p=s.top();
s.pop();
cout<<p->data <<" ";
p=p->right ;
}
}
}
void Btree::FdgpreOrder(mytree t)//前序非递归遍历
{
if(t==NULL)
;
mytree p=t;
stack<mytree> s;
while(!s.empty()||p)
{
while(p)
{
cout<<p->data <<" ";
s.push(p);
p=p->left ;
}
if(!s.empty())
{
p=s.top();
s.pop();
p=p->right ;
}
}
}
void Btree::FdgpostOrder(mytree t)//后序非递归遍历
{
int n;
if(root==NULL)
;
stack<mytree> s;
mytree pNow,pLast;
pNow=t;
pLast=NULL;
while(pNow)
{
s.push(pNow);
n=pNow->data ;
pNow=pNow->left ;//将pNow放到左子树
}
while(!s.empty())
{
pNow=s.top();
n=pNow->data ;
s.pop();
if(pNow->right ==NULL||pNow->right ==pLast)
{
cout<<pNow->data<<" " ;
pLast=pNow;
n=pNow->data ;
}
else if (pNow->left == pLast)
{
s.push(pNow);
pNow=pNow->right ;
n=pNow->data ;
while(pNow)
{
s.push(pNow);
pNow=pNow->right ;
}
}
}
}
简述一下思路,中序就是先把左子树放到栈里,再吐出来,再遍历右子数
前序就是先存起来左子树,然后打印根节点,最后右子树;
后序最麻烦,要先遍历完左右子树,最后打印根节点,所以不仅要判断当前节点,还要关注上一个节点。
排序二叉树应用 2
最新推荐文章于 2021-12-08 14:59:47 发布