给定一棵二叉树的括号表示,请构造该二叉树的二叉链存储结构,并采用非递归算法对该二叉树进行先序、中序和后序遍历。
要求从键盘读入一个括号表示的二叉树字符串,然后输出它们的先序遍历序列、中序遍历序列和后序遍历序列。
输入格式:
输入一行字符串。
输出格式:
输出三行,第一行为先序遍历序列、第二行为中序遍历序列、第三行为后序遍历序列。
输入样例:
在这里给出一组输入。例如:
A(B(,C(D,)),E(F(G(H,K),),))
输出样例:
在这里给出相应的输出。例如:
ABCDEFGHK
BDCAHGKFE
DCBHKGFEA
#include <iostream>
using namespace std;
typedef char ElemType;
#define MaxSize 100
typedef struct node
{
ElemType data;
struct node *lchild;
struct node *rchild;
} BTNode;
// 1)创建二叉树
void CreateBTree(BTNode *&b, char *str)
{
BTNode *St[MaxSize], *p;
int top = -1, k, j = 0;
char ch;
b = NULL;
ch = str[j];
while (ch != '\0')
{
switch (ch)
{
case '(':
top++;
St[top] = p;
k = 1;
break;
case ')':
top--;
break;
case ',':
k = 2;
break;
default:
p = new BTNode;
p->data = ch;
p->lchild = p->rchild = NULL;
if (b == NULL)
{
b = p;
}
else
{
switch (k)
{
case 1:
St[top]->lchild = p;
break;
case 2:
St[top]->rchild = p;
break;
}
}
}
j++;
ch = str[j];
}
}
// 2)销毁二叉树
void DestroyBTree(BTNode *&b)
{
if (b != NULL)
{
DestroyBTree(b->lchild);
DestroyBTree(b->rchild);
free(b);
}
}
// 3)查找结点
BTNode *FindNode(BTNode *b, ElemType x)
{
BTNode *p;
if (b == NULL)
{
return 0;
}
else if (b->data == x)
{
return b;
}
else
{
p = FindNode(b->lchild, x);
if (p != NULL)
{
return p;
}
else
{
return FindNode(b->rchild, x);
}
}
}
// 4)找孩子结点
BTNode *LchildNode(BTNode *p)
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p)
{
return p->rchild;
}
// 5)求高度
int BTHeight(BTNode *b)
{
int lchild, rchild;
if (b == NULL)
{
return 0;
}
else
{
lchild = BTHeight(b->lchild);
rchild = BTHeight(b->rchild);
return max(lchild, rchild) + 1;
}
}
// 6)输出二叉树
void DispBTree(BTNode *b)
{
if (b != NULL)
{
printf("%c", b->data);
if (b->lchild != NULL || b->rchild != NULL)
{
printf("(");
DispBTree(b->lchild);
if (b->rchild != NULL)
{
printf(",");
}
DispBTree(b->rchild);
printf(")");
}
}
}
// 7)查找叶子结点
int FindLeaves(BTNode *b)
{
if (b == NULL)
{
return 0;
}
if (b->lchild == NULL && b->rchild == NULL)
{
return 1;
}
int count = 0;
count += FindLeaves(b->lchild);
count += FindLeaves(b->rchild);
return count;
}
//先序遍历方法
void PreOrder(BTNode *b)
{
if (b != NULL)
{
printf("%c", b->data);
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
// 中序遍历方法
void InOrder(BTNode *b)
{
if (b != NULL)
{
InOrder(b->lchild);
printf("%c", b->data);
InOrder(b->rchild);
}
}
//后序遍历方法
void PostOrder(BTNode *b)
{
if (b != NULL)
{
PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c", b->data);
}
}
// 交换左右孩子结点
void Replace(BTNode *&b)
{
BTNode *p;
if (b != NULL)
{
p = b->rchild;
b->rchild = b->lchild;
b->lchild = p;
Replace(b->lchild);
Replace(b->rchild);
}
}
int main()
{
char str[MaxSize];
cin.getline(str, MaxSize);
BTNode *b;
CreateBTree(b, str);
PreOrder(b);
cout<<endl;
InOrder(b);
cout << endl;
PostOrder(b);
cout<<endl;
DestroyBTree(b);
return 0;
}