二叉树的先序遍历和逆先序遍历输出

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、题目

二叉树bt:A(B(D,E(G,H)),C(,F(I)))

构造先序线索二叉树tb

A B D E G H C F I

输出逆先序二叉树tb

I F C H G E D B A

二、解答

#include  <stdio.h>
#include  <malloc.h>
#define  MaxSize  100
typedef  char  ElemType;
typedef  struct  tnode
{
    ElemType  data;                                        //数据域
    struct  tnode* lchild, * rchild;        //指针域
}  BTNode;

void  CreateBTree(BTNode*& bt, char* str)
{
    BTNode* St[MaxSize], * p = NULL;
    int  top = -1, k, j = 0;
    char  ch;
    bt = NULL;                        //建立的二叉树初始时为空
    ch = str[j];
    while (ch != '\0')        //str未扫描完时循环
    {
        switch (ch)
        {
        case  '(':top++; St[top] = p; k = 1;  break;        //为左孩子结点
        case  ')':top--; break;
        case  ',':k = 2;  break;                                        //为右孩子结点
        default:p = (BTNode*)malloc(sizeof(BTNode));
            p->data = ch; p->lchild = p->rchild = NULL;
            if (bt == NULL)                                        //*p为二叉树的根结点
                bt = p;
            else                                                        //已建立二叉树根结点
            {
                switch (k)
                {
                case  1:St[top]->lchild = p; break;
                case  2:St[top]->rchild = p; break;
                }
            }
        }
        j++;
        ch = str[j];
    }
}
void  PreOrder(BTNode* bt)
{
    if (bt != NULL)
    {
        printf("%c ", bt->data);
        PreOrder(bt->lchild);
        PreOrder(bt->rchild);
    }
}
void  PreOrder1(BTNode* bt)        // 逆先序遍历
{
    if (bt != NULL)
    { 
        PreOrder1(bt->rchild);
        PreOrder1(bt->lchild);
        printf("%c ", bt->data);
    }
}

void  DestroyBTree(BTNode*& bt)
{
    if (bt != NULL)
    {
        DestroyBTree(bt->lchild);
        DestroyBTree(bt->rchild);
        free(bt);
    }
}

void  DispBTree(BTNode* bt)
{
    if (bt != NULL)
    {
        printf("%c", bt->data);
        if (bt->lchild != NULL || bt->rchild != NULL)
        {
            printf("(");                        //有子树时输入'('
            DispBTree(bt->lchild);        //递归处理左子树
            if (bt->rchild != NULL)        //有右子树时输入'.'
                printf(",");
            DispBTree(bt->rchild);        //递归处理右子树
            printf(")");                        //子树输出完毕,再输入一个')'
        }
    }
}
int  main()
{
    BTNode* bt;
    char str[] = "A(B(D,E(G,H)),C(,F(I)))";
    CreateBTree(bt, str);
    printf("二叉树bt:"); DispBTree(bt); printf("\n");
    printf("构造先序线索二叉树tb\n");
    PreOrder(bt);
    printf("\n");
    printf("输出逆先序二叉树tb\n");
    PreOrder1(bt);
    printf("\n");
    return  0;

}



总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了二叉树广义表的使用,提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值