栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

二叉树遍历练习 - 递归/非递归

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二叉树遍历练习 - 递归/非递归

参考:https://blog.csdn.net/winter2121/article/details/99560253
样例:

样例输入:ABD##E##C#FG##H##

#include 
#include 
struct Node
{
    char data;
    struct Node *lchild, *rchild;
};

Node *createTree()
{
    char ch = getchar();
    if (ch != '#')
    {
        Node *p = (Node *)malloc(sizeof(Node));
        p->data = ch;
        p->lchild = createTree();
        p->rchild = createTree();
        return p;
    }
    return NULL;
}

void display_pre(Node *rt) //递归先序
{
    if (rt == NULL)
        return;
    putchar(rt->data);
    display_pre(rt->lchild);
    display_pre(rt->rchild);
}
void display_mid(Node *rt) //递归中序
{
    if (rt == NULL)
        return;
    display_mid(rt->lchild);
    putchar(rt->data);
    display_mid(rt->rchild);
}
void display_back(Node *rt) //递归后序
{
    if (rt == NULL)
        return;
    display_back(rt->lchild);
    display_back(rt->rchild);
    putchar(rt->data);
}

void display_pre_stack(Node *rt) //非递归先序
{
    Node *p = rt, *st[100]; // st栈
    int top = 0;            //栈实时大小
    while (p || top > 0)
    {
        if (p)
        {
            printf("%c", p->data);
            st[top++] = p;
            p = p->lchild;
        }
        else
        {
            p = st[--top];
            p = p->rchild;
        }
    }
}

void display_mid_stack(Node *rt) //非递归中序
{
    Node *p = rt, *st[100]; // st栈
    int top = 0;            //栈实时大小
    while (p || top > 0)
    {
        if (p)
        {
            st[top++] = p;
            p = p->lchild;
        }
        else
        {
            p = st[--top];
            printf("%c", p->data);
            p = p->rchild;
        }
    }
}

void display_back_stack(Node *rt) //非递归后序遍历
{
    Node *last = NULL, *p, *st[100];
    int top = 0; //栈元素数量
    st[top++] = rt;
    while (top > 0)
    {
        p = st[top - 1];                                         //取栈顶为p
        if (p->lchild && p->lchild != last && p->rchild != last) // p左子树存在&&未访问
        {
            p = p->lchild;
            st[top++] = p;
        }
        else if (p->rchild && p->rchild != last) // p右子树存在&&未访问
        {
            p = p->rchild;
            st[top++] = p;
        }
        else //左右均已访问,输出当前p,并从栈中弹出
        {
            printf("%c", p->data);
            top--; // p出栈
            last = p;
        }
    }
}

int main()
{
    Node *root = createTree(); // ABD##E##C#FG##H##
    printf("递归先序遍历:");
    display_pre(root);
    printf("n递归中序遍历:");
    display_mid(root);
    printf("n递归后序遍历:");
    display_back(root);

    printf("n非递归先序遍历:");
    display_pre_stack(root);
    printf("n非递归中序遍历:");
    display_mid_stack(root);
    printf("n非递归后序遍历:");
    display_back_stack(root);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832866.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号