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

来源:互联网 发布:JVM1099端口被占用 编辑:程序博客网 时间:2024/06/06 19:11


建立二叉树的二叉链表

描述:

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

输入:

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

输出:

输出二叉树的后序序列

输入样例:

ABCDEGFCBEGDFA

输出样例:

CGEFDBA



#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、记忆前中后序序列的方法,以及了解一些特殊序列如带括号序列,#表示空的序列。

1 0
原创粉丝点击