数据结构——二叉树的基本操作

二叉树的非递归遍历用到了栈和队列,这里为了方便,当然也是为了代码尽可能短和提高效率,用到了C++STL里面的栈和队列,不感觉麻烦的,也可以自己手写栈和队列

栈:http://blog.csdn.net/qq_34287501/article/details/72368962

队列:http://blog.csdn.net/qq_34287501/article/details/72370710


#include<bits/stdc++.h>
#define N 5

using namespace std;
typedef char TElemType;

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

typedef struct f_node
{
    BiTree bitree;
    char f;
}f_node, *ff_node;

void menu()
{
    printf("\t1.先序遍历\n");
    printf("\t2.中序遍历\n");
    printf("\t3.后序遍历\n");
    printf("\t4.先序遍历(非递归)\n");
    printf("\t5.中序遍历(非递归)\n");
    printf("\t6.后序遍历(非递归)\n");
    printf("\t7.层次遍历\n");
    printf("\t8.退出\n");
}

void CreatBiTree(BiTree &T)
{
    char ch;
    scanf(" %c", &ch);
    if(ch == '#') T = NULL;
    else
    {
        T = (BiTree)malloc(sizeof(BiTNode));
        T->data = ch;
        CreatBiTree(T->lchild);
        CreatBiTree(T->rchild);
    }
}

void PreOrder(BiTree T)
{
    if(T == NULL) return ;
    printf("%c ", T->data);
    PreOrder(T->lchild);
    PreOrder(T->rchild);
}

void Inorder(BiTree T)
{
    if(T == NULL) return ;

    Inorder(T->lchild);
    printf("%c ", T->data);
    Inorder(T->rchild);
}

void PostOrder(BiTree T)
{
    if(T == NULL) return ;
    PostOrder(T->lchild);
    PostOrder(T->rchild);
    printf("%c ", T->data);
}

void PreOrder2(BiTree T)
{
    stack<BiTree> s;
    BiTree q = T;
    while(q || !s.empty())
    {
        if(q)
        {
            printf("%c ", q->data);
            s.push(q);
            q = q->lchild;
        }
        else
        {
            q = s.top(); s.pop();
            q = q->rchild;
        }
    }
}

void Inorder2(BiTree T)
{
    stack<BiTree> s;
    BiTree q = T;
    while(q || !s.empty())
    {
        if(q)
        {
            s.push(q);
            q = q->lchild;
        }
        else
        {
            q = s.top(); s.pop();
            printf("%c ", q->data);
            q = q->rchild;
        }
    }

}



void PostOrder2(BiTree T)
{
    stack<ff_node> s;
    BiTree q = T;

    while(q || !s.empty())
    {
        while(q)
        {
            ff_node f = (ff_node)malloc(sizeof(f_node));
            f->bitree = q;
            f->f = 'L';
            s.push(f);
            q = q->lchild;
        }
        while(!s.empty() && (s.top()->f == 'R'))
        {
            ff_node f = s.top(); s.pop();

            printf("%c ", f->bitree->data);
        }
        if(!s.empty())
        {
            ff_node f = s.top();
            q = f->bitree;
            f->f = 'R';
            q = q->rchild;
        }

    }
}

void LevelOrder(BiTree T)
{
    queue<BiTree> q;
    q.push(T);
    while(!q.empty())
    {
        T = q.front(); q.pop();
        printf("%c ", T->data);
        if(T->lchild) q.push(T->lchild);
        if(T->rchild) q.push(T->rchild);
    }
}

int main()
{
    BiTree T;
    printf("\t初始化(例如:ABC##DE#G##F###, #代表左(右)子树为空):\n");
    CreatBiTree(T);
    while(true)
    {
        menu();
        int sel;
        scanf("%d", &sel);
        switch(sel)
        {
            case 1: PreOrder(T);   cout << endl; break;
            case 2: Inorder(T);    cout << endl; break;
            case 3: PostOrder(T);  cout << endl; break;
            case 4: PreOrder2(T);  cout << endl; break;
            case 5: Inorder2(T);   cout << endl; break;
            case 6: PostOrder2(T); cout << endl; break;
            case 7: LevelOrder(T); cout << endl; break;
        }
        if(sel == 8) break;
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值