已知非空的二叉树的先序序列和中序序列,建立这棵二叉树的二叉链表,输出后序序列并计算二叉树中左子树的结点个数。假设树的结点个数不超过26个。
输入格式:
输入共二行,分别给出非空的二叉树的先序序列和中序序列。
输出格式:
输出也是二行,第一行输出二叉树的后序序列,第二行输出二叉树中左子树的结点个数。
输入样例:
ABCDEGF
CBEGDFA
输出样例:
CGEFDBA
6
#include<stdio.h>
#include<stdlib.h>
typedef char TElemType;
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define N 100
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BITree;
//
BiTNode* createBiTree(char *pre, char *in, int n)
{
int n1 = 0,n2 = 0;
int m1 = 0,m2 = 0;
BiTNode* node = NULL;
char lpre[100],rpre[100];//先序遍历左子树元素,右子树元素
char lin[100],rin[100];//中序遍历左子树元素,右子树元素
if (n == 0)//空树
{
return NULL;
}
node = (BiTNode*)malloc(sizeof(BiTNode));//根节点
if (node==NULL)
{
return NULL;
}
node->data = pre[0];//先序序列的第一个元素必为根结点
//根据根结点将中序序列分为左子树和右子数
int i;
for (i = 0; i<n; i++)
{
if ((i<=n1)&&(in[i]!=pre[0]))
{
lin[n1++] = in[i];
}
else if(in[i]!=pre[0])
{
rin[n2++] = in[i];
}
}
//根据树的先序序列的长度等于中序序列的长度
//且先序遍历是先左子树再后子树,无论先序还是中序 左子树和右子树的长度都是固定的
//从i=1开始 因为先序遍历的第一个是根
for (i = 1; i < n; i++)
{
if (i< (n1+1))//n1代表了左子树的长度
{
lpre[m1++] = pre[i];
}
else
{
rpre[m2++] = pre[i];
}
}
node->lchild = createBiTree(lpre,lin,n1);
node->rchild = createBiTree(rpre,rin,n2);
return node;
}
Status PostOrder(BITree T)//后序遍历
{
if(!T)
return ERROR;
else
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c",T->data);
return OK;
}
}
int NodeCount (BITree T)
{
int nodes;
if (T==NULL)
return 0;
// else if(T->lchild==NULL&&T->rchild==NULL)
// nodes=1;
else
nodes=1+NodeCount(T->lchild)+NodeCount(T->rchild);
return nodes;
}
int main()
{
char preNode[N];//先序遍历存放
char inNode[N];//中序遍历存放
int n = 0;//树的长度
char ch;
BITree T;
//printf("请输入先序序列\n");
while((ch = getchar())&&ch!='\n')
preNode[n++] = ch;
//printf("请输入中序序列\n");
n = 0;
while((ch = getchar())&&ch!='\n')
inNode[n++] = ch;
T = createBiTree(preNode,inNode,n);//先序序列,中序序列,树的长度
//printf("后序序列\n");
PostOrder(T);
//BITree T;
printf("\n");
printf("%d\n", NodeCount(T)-NodeCount(T->rchild)-1);//减去右子树结点和根节点
return 0;
}