二叉树先序,中序,后序遍历非递归实现

</pre><pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
using namespace std;
char in[30],pre[30],last[30];

typedef struct mynode
{
    char data;
    struct mynode* leftchild;
    struct mynode* rightchild;
} Node,*pNode;

void build(char *pre,char *in,int len,pNode &root)
{
    if(len<1)
        return;
    int i=0;
    while(pre[0]!=in[i])i++;
    root = (pNode)malloc(sizeof(Node));
    root->data = pre[0];
    root->rightchild = root->leftchild = NULL;
    build(pre+1,in,i,root->leftchild);
    build(pre+i+1,in+i+1,len-i-1,root->rightchild);
}

//层序遍历
void seqorder(pNode root)
{
    pNode temp;
    queue<pNode> qe;
    qe.push(root);
    while(!qe.empty())
    {
        temp = qe.front();
        qe.pop();
        printf("%c",temp->data);
        if(temp->leftchild)
            qe.push(temp->leftchild);
        if(temp->rightchild)
            qe.push(temp->rightchild);
    }
}

//中序遍历
void inorder(pNode root)
{
    if(NULL==root) return;
    inorder(root->leftchild);
    printf("%c",root->data);
    inorder(root->rightchild);

}

//前序遍历
void preorder(pNode root)
{
    if(NULL==root) return;
    printf("%c",root->data);
    preorder(root->leftchild);
    preorder(root->rightchild);
}

//后续遍历
void lastorder(pNode root)
{
    if(NULL==root)return;
    lastorder(root->leftchild);
    lastorder(root->rightchild);
    printf("%c",root->data);
}

//前序非递归
void _preorder(pNode root)
{
    stack<pNode> stk;
    while(!stk.empty()||root==NULL)
    {
        while(root)
        {
            stk.push(root);
            printf("%c",root->data);
            root = root->leftchild;
        }
        root = stk.top();
        root = root->rightchild;
        stk.pop();
    }
}
//中序遍历非递归
void _inorder(pNode root)
{
    stack<pNode> stk;

    while(root||!stk.empty())
    {
        while(root)
        {
            stk.push(root);
            root = root->leftchild;
        }
        root = stk.top();
        stk.pop();
        printf("%c",root->data);
        root = root->rightchild;
    }
}

//后续遍历非递归
void _lastorder(pNode root)
{
    int flag[30];
    stack<pNode> stk;
    while(root)
    {
        stk.push(root);
        flag[stk.size()] = 0;
        root = root->leftchild;
    }

    while(!stk.empty())
    {
        root = stk.top();
        while(root->rightchild&&flag[stk.size()]==0)
        {
            flag[stk.size()] = 1;
            root = root->rightchild;
            while(root)
            {
                stk.push(root);
                flag[stk.size()] = 0;
                root = root->leftchild;
            }
            root = stk.top();
        }
        printf("%c",root->data);
        stk.pop();
    }
}
int main(void)
{
    scanf("%s %s",pre,in);
    pNode root;
    build(pre,in,strlen(pre),root);
    //lastorder(root);
    _lastorder(root);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值