给定二叉树的广义表表示,构造二叉树并输出二叉树的四种遍历顺序。
输入说明:
输入仅一行,该行仅由‘(’、‘)’、‘,’以及大小写字符构成的二叉树的广义表表示,字符串长度不超过100。
输出说明:
在接下来的四行中依行输出二叉树的四种遍历
输入样列:
A(B(D,),C(E,F(,H)))
输出样列:
ABDCEFH
DBAECFH
DBEHFCA
ABCDEFTHab
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <cctype>
using namespace std;
#define N 100
typedef char Element;
struct Node
{
Element data;
struct Node *lchild;
struct Node *rchild;
};
typedef struct Node BTNode;
typedef struct Node * BTree;
BTree Create_BTree(char s[]);
BTree NewNode(Element x);
void Pre_Order(BTree root);
void In_Order(BTree root);
void Post_Order(BTree root);
void Level_Order(BTree root);
int main()
{
char s[N];
BTree root=NULL;
gets(s);
root=Create_BTree(s);
Pre_Order(root);
printf("\n");
In_Order(root);
printf("\n");
Post_Order(root);
printf("\n");
Level_Order(root);
printf("\n");
return 0;
}
BTree NewNode(Element x)
{
BTree p=(BTree)malloc(sizeof(BTNode));
p‐>data=x;
p‐>lchild=NULL;
p‐>rchild=NULL;
return p;
}
BTree Create_BTree(char s[])
{
int i,k,top;
BTree path[N],p;
k=0;
top=‐1;
for(i=0;s[i]!='\0';i++)
{
switch(s[i])
{
case '(':
path[++top]=p;
k=1;
break;
case ',':
k=2;
break;
case ')':
top‐‐;
break;
}
if(isalpha(s[i]))
{
p=NewNode(s[i]);
if(k==1)
path[top]‐>lchild=p;
else if(k==2)
path[top]‐>rchild=p;
}
}
return path[0];
}
void Pre_Order(BTree root)
{
if(root!=NULL)
{
printf("%c",root‐>data);
Pre_Order(root‐>lchild);
Pre_Order(root‐>rchild);
}
}
void In_Order(BTree root)
{
if(root!=NULL)
{
In_Order(root‐>lchild);
printf("%c",root‐>data);
In_Order(root‐>rchild);
}
}
void Post_Order(BTree root)
{
if(root!=NULL)
{
Post_Order(root‐>lchild);
Post_Order(root‐>rchild);
printf("%c",root‐>data);
}
}
void Level_Order(BTree root)
{
BTree q[N],p;
int front=0 ,rear=0;
if(root!=NULL)
{
rear=(rear+1)%N;
q[rear]=root;
}
while(front!=rear)
{
front=(front+1)%N;
p=q[front];
printf("%c",p‐>data);
if(p‐>lchild!=NULL)
{
rear=(rear+1)%N;
q[rear]=p‐>lchild;
}
if(p‐>rchild!=NULL)
{
rear=(rear+1)%N;
q[rear]=p‐>rchild;
}
}
}