用括号的表示法表示二叉树字符串,例如:A(B(D,E),C(,F))。
1、" ( " 前的创建的结点存在孩子结点,将其进栈,用来建立它与孩子之前的关系(它孩子是左孩子还是有孩子,与其相连),如果一个结点创建完毕,其后一个字符不是”( “,表示该借点是叶节点不需要进栈。然后开始处理该节点的左孩子。
2、“ )”表示该栈顶结点为根节点的子树创建完毕,将其退栈。
3、“,”表示开始处理栈顶结点的右孩子结点,k=2
代码如下:
#include<iostream>
#include<string>
#include<malloc.h>
#define Maxsize 100
using namespace std;
typedef struct node{
char data;
struct node *lchild;
struct node *rchild;
}BTNode;
void GreateBTree(BTNode *&b,string str)
{
BTNode *St[Maxsize],*p;//顺序栈存储,p指向新的节点
int j=0,k;//j作为下标遍历字符串str,k:判断当前的节点作为左孩子还是右孩子。
int top=-1;
b=NULL;//先初始化空树
while(str[j]!='\0')//遍历字符串的每一个字符
{
switch(str[j])
{
case '(':top++;St[top]=p;k=1;break;
case ')':top--;break;
case ',':k=2;break;
default:
p=new BTNode;
p->data=str[j];
p->lchild=NULL;
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++;
}
}
void DispBTree(BTNode *b)
{
if(b!=NULL)
{
cout<<b->data;
if(b->lchild!=NULL||b->rchild!=NULL)
{
cout<<'('; //有孩子节点才输出'('
DispBTree(b->lchild); //递归输出左子树
if(b->rchild!=NULL)
cout<<','; //有右孩子节点输出','
DispBTree(b->rchild);
cout<<')'; //退栈
}
}
}
int main()
{
BTNode *b;
string str;
cin>>str;
GreateBTree(b,str);
DispBTree(b);
return 0;
}
运算结果如下: