关于二叉树的二叉链表存储结构的两道题目


建立二叉树的二叉链表

描述:

已知二叉树的中序序列和前序序列存放在两个一维数组中,尝试建立二叉树的二叉链表。检查是否建立成功的方法是输出该二叉树的后序序列。

输入:

分别输入二叉树的中序序列和前序序列

输出:

输出二叉树的后序序列

输入样例:

ABCDEGF CBEGDFA

输出样例:

C G E F D B A



#include <stdio.h>
#include<stdlib.h>
#include<string.h>

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

void CreateLeft(BTLINK H,int head,int back,char*pre,char*mid);
void CreateRight(BTLINK H,int head,int back,char*pre,char*mid);
void BTPrint (BTLINK H);


int main()
{
    BTLINK A;
    int i;
    char pre[400];
    char mid[400];
    char temp;
    int head,back;

    gets(pre);
    gets(mid);

    head=0;
    back=strlen(pre)-1;

    temp=pre[0];
    for(i=0;i<strlen(pre);i++)
    {
        if(mid[i]==temp)break;
    }

    A=(BTLINK)malloc(sizeof(BTNODE));
    A->data = temp;
    if(i==head) A->lchild = NULL;
    else CreateLeft(A,head,i-1,pre,mid);

    if(i==back) A->rchild = NULL;
    else CreateRight(A,i+1,back,pre,mid);

    BTPrint(A);
    return 0;

}

void CreateLeft(BTLINK H,int head,int back,char*pre,char*mid)
{
    BTLINK p;
    int i,j;
    char temp;
    p=H;
    for(i=0;i<strlen(pre);i++)
    {
        for(j=head;j<=back;j++)
        {
            if(pre[i]==mid[j])
            {
                temp = pre[i];
                p->lchild = (BTLINK)malloc(sizeof(BTNODE));
                p->lchild->data = temp;
                if(j==head)
                {
                    p->lchild->lchild = NULL;
                }
                else
                {
                    CreateLeft(p->lchild,head,j-1,pre,mid);
                }
                if(j == back)
                {
                    p->lchild->rchild = NULL;
                }
                else
                {
                    CreateRight(p->lchild,j+1,back,pre,mid);
                }
                return ;
            }
        }
    }


}
void CreateRight(BTLINK H,int head,int back,char*pre,char*mid)
{
    BTLINK p;
    int i,j;
    char temp;
    p=H;
    for(i=0;i<strlen(pre);i++)
    {
        for(j=head;j<=back;j++)
        {
            if(pre[i]==mid[j])
            {
                temp = pre[i];
                p->rchild = (BTLINK)malloc(sizeof(BTNODE));
                p->rchild->data = temp;
                if(j==head) p->rchild->lchild = NULL;
                else
                {
                    CreateLeft(p->rchild,head,j-1,pre,mid);
                }
                if(j == back) p->rchild->rchild = NULL;
                else
                {
                    CreateRight(p->rchild,j+1,back,pre,mid);
                }
                return ;
            }
        }
    }


}

void BTPrint (BTLINK H)
{
    BTLINK p;
    p=H;
    if(p->lchild !=NULL)
    {
        BTPrint(p->lchild);
    }
    if(p->rchild !=NULL)
    {
        BTPrint(p->rchild);
    }
        printf("%c\n",p->data);


}






------------------------------------------------------------------------------

输出以二叉树表示的算术表达式


描述:

编写一个程序,输出以二叉树表示的算术表达式,若表达式中有括号,则应在输出时加上

输入:

按先序输入一行字符,其中#表示取消建立子树节点

输出:

输出以二叉树表示的算术表达式

输入样例:

*+a(###b#)##c##

输出样例:

(a+b)*c



#include <stdio.h>
#include<stdlib.h>
#include<string.h>

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

void CreateLeft(BTLINK H);
void CreateRight(BTLINK H);
void BTPrint (BTLINK H);


int main()
{
    BTLINK A;
    char temp;
    temp = getchar();
    if(temp == '#')
    {
        A=NULL;
    }
    else
    {
        A=(BTLINK)malloc(sizeof(BTNODE));
        A->data = temp;
        CreateLeft(A);
        CreateRight(A);
    }

    BTPrint(A);
    printf("\n");
    return 0;

}

void CreateLeft(BTLINK H)
{
    BTLINK p;
    char temp;

    p=H;
    temp = getchar();
    if(temp=='#')
    {
        p->lchild = NULL;
    }
    else
    {
        p->lchild = (BTLINK)malloc(sizeof(BTNODE));
        p->lchild->data = temp;
        CreateLeft(p->lchild);
        CreateRight(p->lchild);
    }

}
void CreateRight(BTLINK H)
{
    BTLINK p;
    char temp;

    p=H;
    temp = getchar();
    if(temp=='#')
    {
        p->rchild = NULL;
    }
    else
    {
        p->rchild = (BTLINK)malloc(sizeof(BTNODE));
        p->rchild->data = temp;
        CreateLeft(p->rchild);
        CreateRight(p->rchild);
    }

}


void BTPrint (BTLINK H)
{
    BTLINK p;
    p=H;
    if(p->lchild !=NULL)
    {
        BTPrint(p->lchild);
    }
    printf("%c",p->data);
    if(p->rchild !=NULL)
    {
        BTPrint(p->rchild);
    }



}


TIP:

1、对于二叉树问题,无论是采用二叉/三叉链表存储方式,还是采用数组存储,体会调用函数时分Left函数和Right函数的好处。

2、连续递归调用的思想:逐层深入直到某一条件,再逐层退出(退出时要完成每层调用返回位置接下来的语句,才能再返回上一层)。

3、记忆前中后序序列的方法,以及了解一些特殊序列如带括号序列,#表示空的序列。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值