输入一颗二叉树,你的任务是按从上到下、从左到右的顺序输出各个结点的值。每个结点都按照从根结点到它的移动序列给出(L表示左,R表示右)。在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开。每颗树的输入用一对空括号“()”结束(这对括号本身不代表一个结点)。如果从根到某个叶结点的路径上有的结点没有在输入中给出,或者给出超过一次,应当输出-1。
例如输入:
(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
输出:
5 4 8 11 13 4 7 2 1
输入:
(3,L)(4,R)()
输出
-1
#include"iostream" #include"queue" using namespace std; typedef int element; class Tree{ private: element data; Tree *left; Tree *right; public: Tree(element data = 0){ this->data = data; left = NULL; right = NULL; } void showsq(){ queue<Tree*> q; q.push(this); while(!q.empty()){ Tree *p = q.front(); cout<<p->data<<ends; if(p->left){ q.push(p->left); } if(p->right){ q.push(p->right); } q.pop(); } } void dynamicCreate(Tree* &t,int data,char *pos,int i = 0){ if(!t){ t = new Tree(); } if(pos[i] == ')'){ t->data = data; } else if(pos[i] == 'L'){ dynamicCreate(t->left,data,pos,i + 1); } else if(pos[i] == 'R'){ dynamicCreate(t->right,data,pos,i + 1); } else{ return ; } } }; int main(){ void pickup(char *s,int &data,char* position); Tree *t = NULL; int data; char position[20],str[50]; while(true){ cin>>str; if(str[1] == ')'){ break; } pickup(str,data,position); //提取信息 t->dynamicCreate(t,data,position); } t->showsq(); return 0; } void pickup(char *s,int &data,char* position){ data = atoi(&s[1]); char *pos = strchr(s,',') + 1; strcpy(position,pos); } //(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) () //(11,LL) (7,LLL) (8,R) //(12,R) (2,LLR) ()