烦人的括号
Description
每次看见二叉树在广义表里被一堆括号团团包围,Leo就感到一片眩晕,不知道那棵树究竟长成什么样。不如你来把那些烦人的括号去掉吧?
Input
1+n行数据:
第一行:数据组数t(0 < t < 100)
余下n行:每一行都是一个广义表下表示的二叉树(长度<10000)
Output
n行数据:
每行为对应二叉树的先序遍历结果
Sample Input
2 A(B,C) P(F(J(L,H),Q(D,T)),G(N(,K),Z(W,S)))
Sample Output
ABC PFJLHQDTGNKZWS
#include<iomanip> #include<iostream> #include<cstdlib> #define MaxSize 20000 using namespace std; typedef char ElemType; //typedef ElemType SqBTree[MaxSize]; typedef struct node { ElemType data; struct node *lchild; struct node *rchild; }BTNode; //创建树 void CreateBTNode(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 = (BTNode *)malloc(sizeof(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]; } } // 查找节点 BTNode *FIndNode(BTNode *b, ElemType x) { BTNode *p; if (b==NULL) return NULL; else if (b->data ==x) return b; else { p = FIndNode(b->lchild, x); if (p!=NULL) return p; else return FIndNode(b->rchild, x); } } //找孩子节点 BTNode *LchildNode(BTNode *p) { return p->lchild; } BTNode *RchildNode(BTNode *p) { return p->rchild; } //求高度 void DispBTNode(BTNode *b) { if(b!=NULL) { printf(" %c", b->data); if (b->lchild != NULL || b->rchild != NULL) { printf("("); DispBTNode(b->lchild); if (b->rchild!=NULL) printf(","); DispBTNode(b->rchild); printf(")"); } } } //二叉树先序遍历递归算法 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 LevelOrder(BTNode *b) { BTNode *p; BTNode *qu[MaxSize]; int front, rear; front = rear = -1; rear++; qu[rear] = b; while (front != rear) { front = (front + 1)%MaxSize; p = qu[front]; printf(" %c ", p->data); if (p->lchild != NULL) { rear = (rear + 1)%MaxSize; qu[rear] = p->lchild; } if (p->rchild != NULL) { rear = (rear + 1)%MaxSize; qu[rear] = p->rchild; } } } int main() { char s[10000]; int t; cin>>t; for(int i=0;i<t;i++) { cin>>s; BTNode *b; CreateBTNode(b,s); PreOrder(b); cout<<endl; for(int j=0;j<sizeof(s);j++) { s[j]=0; } } }