数据结构——二叉树的递归/非递归遍历

复习一下二叉树递归非递归的先中后序遍历

写非递归后序遍历的时候卡壳了,参考了一下网上的思路,大概有两种,一种是标记每个节点是否有走过,如果父节点的左右子节点都标记访问过,则可以访问父节点;一种是定义一个指针,指向上一个访问的节点,如果某父节点的右子节点为NULL或者是上一个访问的节点,则该父节点应当被访问。

#include<iostream>
#include<stdlib.h>
#include<stack>

#define size 20

using namespace std;

typedef struct BiTNode{
    char data;
    BiTNode *lchild, *rchild;
}BiTNode,*BiTree;

//按先序遍历二叉树的创建
void create_BiTree(BiTree &exa){
    char input_char;
    cin>>input_char;
    if(input_char=='#'){
        exa=NULL;
        return;
    }
    else{
        exa=(BiTree)malloc(sizeof(BiTNode));
        exa->data=input_char;
        create_BiTree(exa->lchild);
        create_BiTree(exa->rchild);
    }
}

//递归方式先序遍历
void digui_preorder(BiTree exa){
    if(exa==NULL)
        return;
    cout<<exa->data;
    digui_preorder(exa->lchild);
    digui_preorder(exa->rchild);
}

//递归方式中序遍历
void digui_inorder(BiTree exa){
    if(exa==NULL)
        return;
    digui_inorder(exa->lchild);
    cout<<exa->data;
    digui_inorder(exa->rchild);
}

//非递归方式先序遍历
void feidigui_preorder(BiTree exa){
    BiTree temp=exa;
    stack<BiTree> BiTNode_stack;
    while(temp||!BiTNode_stack.empty()){
        if(temp!=NULL){
            BiTNode_stack.push(temp);
            cout<<temp->data;
            temp=temp->lchild;
        }
        else{
            temp=BiTNode_stack.top();
            BiTNode_stack.pop();
            temp=temp->rchild;
        }
    }
}

//非递归方式中序遍历
void feidigui_inorder(BiTree exa){
    BiTree temp=exa;
    stack<BiTree> BiTNode_stack;
    while(temp||!BiTNode_stack.empty()){
        if(temp!=NULL){
            BiTNode_stack.push(temp);
            temp=temp->lchild;
        }
        else{
            temp=BiTNode_stack.top();
            BiTNode_stack.pop();
            cout<<temp->data;
            temp=temp->rchild;
        }
    }
}

//非递归方式后序遍历
void feidigui_postorder(BiTree exa){
    BiTree temp=exa, pointer=NULL;
    stack<BiTree> BiTnode_stack;
    while(temp!=NULL){
        BiTnode_stack.push(temp);
        temp=temp->lchild;
    }
    while(!BiTnode_stack.empty()){
        temp=BiTnode_stack.top();
        if(temp->rchild==NULL||temp->rchild==pointer){
            cout<<temp->data;
            BiTnode_stack.pop();
            pointer=temp;
        }
        else{
            temp=temp->rchild;
            while(temp!=NULL){
                BiTnode_stack.push(temp);
                temp=temp->lchild;
            }
        }
    }
}

int main(){
    BiTree T;
    create_BiTree(T);
    digui_preorder(T);
    cout<<endl;
    digui_inorder(T);
    cout<<endl;
    feidigui_preorder(T);
    cout<<endl;
    feidigui_inorder(T);
    cout<<endl;
    feidigui_postorder(T);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值