建立二叉树的二叉链表
描述:
已知二叉树的中序序列和前序序列存放在两个一维数组中,尝试建立二叉树的二叉链表。检查是否建立成功的方法是输出该二叉树的后序序列。
输入:
分别输入二叉树的中序序列和前序序列
输出:
输出二叉树的后序序列
输入样例:
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、记忆前中后序序列的方法,以及了解一些特殊序列如带括号序列,#表示空的序列。