#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXSIZE 100//最大节点数
using namespace std;
typedef struct BiTnode{
char data;
struct BiTnode * lchild, * rchild;
}BiTnode, * BiTree;
//二叉树的建立
BiTnode* CreateBTree(char* str) {
BiTnode* St[100], * p=NULL, * b;//st作为顺序栈,保存双亲结点
int top = -1, k, j = 0;//top为栈顶指针
char ch;
b = NULL;//初始时二叉链表为空
ch = str[j];
while (ch != '\0')//循环处理,直到str中的每个字符扫描完毕
{
switch (ch)
{
case '(':top++; St[top] = p; k = 1; break;//开始处理左孩子结点
case ')':top--; break;//双亲结点的子树处理完毕
case',':k = 2; break;//处理右孩子结点
default://遇到数据时创建新结点
p = (BiTnode*)malloc(sizeof(BiTnode));
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];
}
return b;
}
void visit(BiTree t) {
cout << t->data << ' ';
}
int PreOrderTraverse(BiTree t) {
if (t==NULL)
{
return 0;
}
else
{
visit(t);
PreOrderTraverse(t->lchild);
PreOrderTraverse(t->rchild);
return 1;
}
}
int InOrderTraverse(BiTree t) {
if (t == NULL)
{
return 0;
}
else
{
InOrderTraverse(t->lchild);
visit(t);
InOrderTraverse(t->rchild);
return 1;
}
}
int PostOrderTraverse(BiTree t) {
if (t == NULL)
{
return 0;
}
else
{
PostOrderTraverse(t->lchild);
PostOrderTraverse(t->rchild);
visit(t);
return 1;
}
}
int main() {
char str[100] = { '\0' };
while (cin >> str) {
BiTree t = CreateBTree(str);
PostOrderTraverse(t);
cout << endl;
}
return 0;
}
括号字符串表示法是一种用括号来表示二叉树结构的方法。在这种表示法中,每个节点都由一对括号包围,并且子树之间以逗号分隔。具体地说,左括号表示子树的开始,右括号表示子树的结束,逗号表示左右子树之间的分隔。
例如,下面的括号字符串 (A,(B,(D),(E)),(C,(F),()))
表示的二叉树如下图所示:
我们可以根据括号字符串建立二叉树的过程如下:
- 首先创建一个根节点,并将其入栈。
- 从左到右遍历括号字符串,每当遇到一个字符时,如果其为左括号,则说明它是当前节点的左子节点,需要新建一个节点,并将其入栈;如果其为逗号,则跳过;如果其为右括号,则说明当前节点的左右子树已经遍历完毕,需要将其出栈,回到其父节点继续遍历。
- 遍历结束后,栈顶元素即为根节点。