学学二叉树——二叉树遍历(递归与非递归)

递归前序

void pre(BinTree BT){

if(BT{

cout<<BT->Data<<endl;

pre(BT->lchild);

pre(BT->rchild);

}

}

中序后序换一下

层序遍历(每出队一个结点就判断它是否有左右孩子,如果有就入队)

void floor(BinTree BT){

queue<BinTree>q;

BinTree T;

if(BT){
q.push(BT);   //首先先把根结点入队

while(q.size()!=0){     //队列不为空

T=q.front();       //先保存下出队元素

cout<<q.front()<<endl;

q.pop();   //输出然后出队

if(T->lchild){

q.push(T->lchild);

}

if(T->rchild){
q.push(T->rchild);

}

}

}

然后是前中后非递归遍历(需要使用栈)

void pre(BinTree BT){    //前序直接按照放入栈的顺序输出就行

stack<BinTree>s;

BinTree p=BT;

while(p!=NULL||s.size()!=0){    //只有当前结点空且栈中无元素时结束遍历

if(p!=NULL){    //结点不为空就放进栈里

cout<<p->Data<<endl;  

s.push(p);

p=p->lchild;   //先看看左边

}else{    //结点为空需要返回上一个结点然后看看右边

p=s.pop();

p=p->rchild;

}

}

}

中序遍历把输出语句插到p=s.pop()和p=p->rchild之间

后序遍历

 BinTree p=BT;
 BinTree r=NULL;   //r结点证明已经遍历过了
 stack<BinTree>s;
 while(p!=NULL||s.size()!=0){
        if(p!=NULL){
            s.push(p);
            p=p->Left;
        }else{
            p=s.top();     //与前序中序不同的是需要先判断栈顶右子树是否已经遍历过再将其出栈输出
            if(p->rchild==NULL||r==p->rchild){          //没有右子树或右子树已遍历则输出
                s.pop();
                cout<<p->Data<<endl;
                r=p;    //设置该结点为已遍历
                p=NULL;    //看看如果没有这行会发生什么
            }else{  //否则遍历右边
                p=p->Right;
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值